python - 在二维 numpy 数组中查找公共(public)元素

标签 python numpy intersection

如果我有两个(或更多)二维数组,如何在给定行号的情况下仅获取数组之间的公共(public)元素。例如,我有以下格式的数组:

time, position, velocity, acceleration

我想让两个数组只有相同的时间元素,所以第 0 行。我可以使用

np.intersect1d(array1[:, 0], array2[:, 0])

它给出了所有公共(public)时间,但我想从 array1/2 中提取所有匹配的行/列或删除非公共(public)时间元素。到底 array1array2 将具有完全相同的维度,因此我可以:

pos_difference = array1[:, 1] - array2[:, 1]

数组可以有不同的大小,例如:

array1 = [[1, 100.0, 0.0, 0.0], [2, 110.0, 0.0, 0.0], [3, 120.0, 0.0, 0.0]]
array2 = [[1, 101.0, 0.0, 0.0], [3, 119, 0.0, 0.0]]

而且我只想提取公共(public)时间元素,因此 array1 和 array2 将仅包含 Time=1 和 Time=3 的时间,因为它们是公共(public)时间元素。然后我可以走了:

pos_difference = array1[:, 1] - array2[:, 1]

这将是同时两个数组之间的位置差:

# First row will be when time=1 and second row will be when time=3
pos_difference = [[0, -1, 0.0, 0.0], [0, 1, 0.0, 0.0]]

最佳答案

如果你有这些数组:

import numpy as np
array1 = np.array([[1, 100.0, 0.0, 0.0], [2, 110.0, 0.0, 0.0], [3, 120.0, 0.0, 0.0]])
array2 = np.array([[1, 101.0, 0.0, 0.0], [3, 119, 0.0, 0.0]])

正如您所说,您可以使用 np.intersect1d 获取交集,唯一剩下的就是索引数组:

intersect = np.intersect1d(array1[:, 0], array2[:, 0])

array1_matches = array1[np.any(array1[:, 0] == intersect[:, None], axis=0)]
array2_matches = array2[np.any(array2[:, 0] == intersect[:, None], axis=0)]

然后你可以减去它们:

>>> array1_matches - array2_matches
array([[ 0., -1.,  0.,  0.],
       [ 0.,  1.,  0.,  0.]])

这假设您的时间是唯一且已排序的。如果它们未排序,您可以先对它们进行排序:

>>> array1 = array1[np.argsort(array1[:, 0])]
>>> array2 = array2[np.argsort(array2[:, 0])]

如果时间不是唯一的,我不知道你想如何处理,所以我不能在那里给你建议。

关于python - 在二维 numpy 数组中查找公共(public)元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44265572/

相关文章:

python - 为什么 np.array 上的 astype(uint) 不会更改 np.array 元素的类型?

在简单图像中查找角点坐标的算法

python - 用 Python 写入 Windows 日志

python - Matplotlib hexbin log scale colorbar 刻度标签作为指数

python - 使用 Python 根据列表值对矩阵列进行排序

python - 无需迭代即可遍历数据框的每一行

java - 如何计算两组的交集?

java - 找到两个 3D 多边形的交点

python - 我们可以使用 modelform 来更新模型的现有实例吗?

python - django rest framework "TypeError: ' type'对象不可迭代“错误