【问题标题】:Finding matching pairs (intersection) of values between two 2D arrays?在两个二维数组之间查找匹配的值对(交集)?
【发布时间】:2022-07-30 21:50:04
【问题描述】:

我有两个数组:

arr1 = np.array((
    np.array([ 32,  32,  32,  32,  32,  39], dtype=np.int64),
    np.array([449, 451, 452, 453, 454, 463], dtype=np.int64)))
arr2 = np.array((
    np.array([ 39,  34,  32,  32,  37,  32], dtype=np.int64),
    np.array([463, 393, 453, 452, 261, 449], dtype=np.int64)))

在这些二维数组中,:

  • 第一个数组(arr1[0]arr2[0])是x轴
  • 第二个数组(arr1[1]arr2[1])是y轴

我想找到两个数组之间匹配的 xy 对

一些说明:

  • arr1arr2 的长度不一定相同。它们的长度可能不同
  • X 值Y 值 对可以按任意顺序排列。不需要在数组之间进行排序或对齐
  • 相同的X值Y值对不会出现在同一个数组中

在上面的例子中,两个数组之间相同的对是:

  • X = 32,Y = 449
  • X = 32,Y = 452
  • X = 32,Y = 453
  • X = 39,Y = 463

我尝试使用np.intersect1d 和我发现的其他一些功能。

【问题讨论】:

  • 跑题了,但是你为什么要做嵌套数组呢?为什么不只是np.array([[...], [...]], dtype=np.int64)

标签: python numpy


【解决方案1】:

使用结构化数组。

import numpy as np

# Define a dtype with x and y integers    
arr1 = np.empty(6, dtype=[('x', int), ('y', int)])
arr2 = np.empty(6, dtype=[('x', int), ('y', int)])

# Add the data to the structured array
arr1['x'] = np.array([ 32,  32,  32,  32,  32,  39])
arr1['y'] = np.array([449, 451, 452, 453, 454, 463])

arr2['x'] = np.array([ 39,  34,  32,  32,  37,  32])
arr2['y'] = np.array([463, 393, 453, 452, 261, 449])

使用 intersect1d:

>>> np.intersect1d(arr1, arr2)
array([(32, 449), (32, 452), (32, 453), (39, 463)],
  dtype=[('x', '<i8'), ('y', '<i8')])

【讨论】:

  • 为了清楚起见,6 是本示例中数组的大小,但其他情况应更改。比如,如果你建立在 OP 的数据之上,你会做 arr1.shape[1]arr2.shape[1],或者类似的东西。
  • 感谢您的回答。在接受您的回答之前,我想知道是否有一种有效的方法可以将其应用于 10 个数组,我需要知道这 10 个数组之间的交集?找到这 10 个数组中出现的相同 x,y 对?
  • 我不确定您到底要什么 - 您想要 10 个数组的交集,还是想要进行 90 个成对的交集?
  • 所以,就像我拥有 2 个 2D 数组并找到它们之间共有的对一样,我想看看您如何建议找到 2 个以上 2D 数组之间共有的对,比如 10 个二维数组,其中维度 1 是 x 轴值,维度 2 是 y 轴值
  • 对不起,我解释错了,我有 2 个单独的数组表示数据,而不是 2D 数组
【解决方案2】:

既然你需要找到夫妻的交集,我认为最好使用set数据结构而不是numpy.array

np.array(list(
    set(zip(*arr1)).intersection(zip(*arr2))
))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多