如何根据其他两列中的值是否匹配单独数组中的值,从2D numpy数组的一列中获取值?

时间:2019-05-09 10:03:59

标签: python-3.x

我有一个类似于所示的二维numpy数组:

intensity_array = 
[[0.000e+00 0.000e+00 1.370e+02]
[0.000e+00 1.000e+00 1.170e+02]
[0.000e+00 2.000e+00 1.240e+02]
...
[1.027e+03 9.810e+02 1.280e+02]
[1.027e+03 9.820e+02 1.170e+02]
[1.027e+03 9.830e+02 1.130e+02]]

前两列是图像中像素的x和y坐标,第三列是该像素的强度。

我还有另一个2D numpy数组:

data_array = 
[[   0.    3.]
[   0.    4.]
[   0.    5.]
...
[1027.  947.]
[1027.  948.]
[1027.  949.]]

此“数据数组”只是某些聚类算法确定为某个聚类的一部分的点的坐标,即“非噪声”。

现在我需要恢复聚集点的强度信息。

我尝试了np.isin,如下所示:

x_mask = np.isin(intensity_array[:,0], data_array[:,0])
y_mask = np.isin(intensity_array[:,1], data_array[:,1])

print(x_mask)
print(y_mask)
mask = np.column_stack((x_mask, y_mask))
print(mask)

哪个给:

[[ True  True]
[ True  True]
[ True  True]
...
[ True  True]
[ True  True]
[ True  True]]

我希望组合的口罩能显示     [正确] 仅当“ data_array”中同时存在点的x和y坐标时,但显然我的逻辑是错误的。

我目前的解决方案涉及使用np.wherefor循环:

intensity_values = np.zeros(len(data_array_actual))

for row_num in range(len(data_array_actual)):
    x_coord = data_array_actual[row_num, 0]
    y_coord = data_array_actual[row_num, 1]

intensity_values[row_num] = 
intensity_array[np.where((intensity_array[:,0] == x_coord) & 
(intensity_array[:,1] == y_coord))[0],2][0]

这有效,但速度很慢,在data_array中可能具有25000点的图像帧上花费了大约2分钟。这意味着分析包含95个此类帧的单个数据集将花费一个多小时。

有更快的方法吗?

0 个答案:

没有答案