如何在二维 numpy 数组中搜索特定 XY 对的位置?

Posted

技术标签:

【中文标题】如何在二维 numpy 数组中搜索特定 XY 对的位置?【英文标题】:How to search for the position of specific XY pairs in a 2 dimensional numpy array? 【发布时间】:2022-01-06 17:10:42 【问题描述】:

我有一个存储为 3 个 Numpy 数组的图像:

# Int arrays of coordinates
# Not continuous, some points are omitted
X_image = np.array([1,2,3,4,5,6,7,9])
Y_image = np.array([9,8,7,6,5,4,3,1])

# Float array of RGB values.
# Same index
rgb = np.array([
    [0.5543,0.2665,0.5589],
    [0.5544,0.1665,0.5589],
    [0.2241,0.6645,0.5249],
    [0.2242,0.6445,0.2239],
    [0.2877,0.6425,0.5829],
    [0.5543,0.3165,0.2839],
    [0.3224,0.4635,0.5879],
    [0.5534,0.6693,0.5889],
])

RGB 信息不能转换为 int。所以它必须保持浮动

我有另一个数组,它定义了图像中某些像素区域的位置:

X_area = np.array([3,4,6])
Y_area = np.array([7,6,4])

我需要找到这些像素的 RGB 信息,使用前 4 个数组作为参考。

我的想法是在全图中搜索这些区域点的索引,然后用这个索引找回RGB信息。

index = search_for_index_of_array_1_in_array_2((X_area,Y_area),(X_image,Y_image))

# index shall be [3,4,6]
rgb_area = rgb[index]

search_for_index_of_array_1_in_array_2 可以用 for 循环来实现。我试过了,太慢了。我其实有几百万分。

我知道与 Python 相比,Julia 的用例可能更多,因为我们处理需要性能的低级数据操作,但我不得不使用 Python。因此,我看到的唯一性能技巧是在 NumPy 中使用矢量化解决方案。

我不习惯操纵 NumPy。我试过numpy.where。

index = np.where(X_area in X_image and Y_area in Y_image )
index

给:

<ipython-input-18-0e434ab7a291>:1: DeprecationWarning: elementwise comparison failed; this will raise an error in the future.
  index = np.where(X_area in X_image and Y_area in Y_image )
(array([], dtype=int64),)

它应该是空的,因为我们有 3 个合规点。

我也测试过,结果一样:

XY_image = np.vstack((X_image,Y_image))
XY_area = np.vstack((X_area,Y_area))
index = np.where(XY_area == XY_image)

甚至:

np.extract(XY_image == XY_area, XY_image)

如果我明白了,问题是数组的长度不同。但这就是我所拥有的。

你知道如何进行吗?

谢谢

编辑:这是一个有效的循环,但......并不快:

indexes = []
for i in range(XY_area.shape[1]):
    XY_area_b =  np.broadcast_to(XY_area[:,i],(9,2)).transpose()
    where_in_image = np.where(XY_area_b == XY_image)
    index_in_image = where_in_image[1][1]
    indexes.append(index_in_image)
indexes

【问题讨论】:

你在“4 个数组”中迷失了我。我看到了 3。而且您的图像数组似乎也缺少一个维度。 呵呵,对不起,是3,打错了。 图片中应该缺少什么尺寸??? Color/RBG(a)图像一般有3个维度:行、列、颜色值 是的... (X_image,Y_image,rgb) 【参考方案1】:

解决这个问题的经典方法一般是使用hashmap。但是,Numpy 不提供这样的数据结构。话虽如此,另一种(通常较慢)解决方案是对值进行排序,然后执行二分搜索。希望 Numpy 提供有用的功能来做到这一点。此解决方案在O(n log(m)) 中运行(n 是要搜索的值的数量,m 是要搜索的值的数量)应该比在O(n m) 时间内运行的线性搜索快得多。这是一个例子:

# Format the inputs
valType = X_image.dtype
assert Y_image.dtype == valType and X_area.dtype == valType and X_image.dtype == valType
pointType = [('x', valType),('y', valType)]
XY_image = np.ravel(np.column_stack((X_image, Y_image))).view(pointType)
XY_area = np.ravel(np.column_stack((X_area, Y_area))).view(pointType)

# Build an index to sort XY_image and then generate the sorted points
sortingIndex = np.argsort(XY_image)
sorted_XY_image = XY_image[sortingIndex]

# Search each value of XY_area in XY_image and find the location in the unsorted array
tmp = np.searchsorted(XY_image, XY_area)
index = sortingIndex[tmp]

rgb_area = rgb[index]

【讨论】:

【参考方案2】:

感谢 Jérôme 的回答,我更了解使用哈希图的价值:

def hashmap(X,Y):
    return X + 10000*Y

h_area = hashmap(X_area,Y_area)
h_image = hashmap(X_image,Y_image)

np.where(np.isin(h_image,h_area))

这个hashmap有点野蛮,但实际上返回的是索引:

(array([2, 3, 5], dtype=int64),)

【讨论】:

以上是关于如何在二维 numpy 数组中搜索特定 XY 对的位置?的主要内容,如果未能解决你的问题,请参考以下文章

在java中搜索特定记录的数组列表

在 MongoDB 中的对象数组中搜索特定属性

如何在 JSON Postgres 数据类型列中搜索特定字符串?

在数组中搜索特定范围内的整数

在一个数组中搜索特定元素并复制另一个数组中的整个对应行

在表格视图控制器iOS swift中搜索特定记录