我有一个类似于所示的二维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.where
和for
循环:
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个此类帧的单个数据集将花费一个多小时。
有更快的方法吗?