快速的向量化方法来检查一行是否包含在Numpy数组中

kyks70gy  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(111)

我有行和列坐标的数组

idx_test_r = np.array([0, 0, 2, 0, 2, 4])
idx_test_c = np.array([0, 1, 0, 2, 2, 6])

# in coordinates format
idx_test = np.stack((idx_test_r, idx_test_c), axis=-1)

字符串
以及两点的行和列坐标

point_r = np.array([0, 2])
point_c = np.array([0, 2])


也就是说,我有坐标为(0, 0), (2, 2)的点。
我想确定idx_test中的每一行是否等于(0, 0)(2, 2)。也就是说,我想要这里给出的情况的结果[True, False, False, False, True, False]
我知道如何用for循环来实现(这个网站上有很多例子),但是我需要在一个循环中多次调用这个函数。
因此,速度是一个非常重要的问题。

编辑

如果不是一维数组idx_test_r,而是二维数组,例如idx_test_r = np.array([[0, 0, 2, 0, 2, 4], [1, 1, 3, 1, 3, 5]])和类似的idx_test_c?我想到了
equal_to_bad_idx = np.logical_or.reduce(np.all(bad_idx[:, None, :] == np.reshape(all_idx, (-1, 2)), axis=2))
但这是相当缓慢的。

z4bn682m

z4bn682m1#

另一个解决方案:

x = np.stack([point_r, point_c]).T
print(np.logical_or.reduce((x[:, np.newaxis] == idx_test).all(axis=2)))

字符串
印刷品:

[ True False False False  True False]

ghhkc1vu

ghhkc1vu2#

import numpy as np

idx_test_r = np.array([0, 0, 2, 0, 2, 4])
idx_test_c = np.array([0, 1, 0, 2, 2, 6])
idx_test = np.stack((idx_test_r, idx_test_c), axis=-1)

point_r = np.array([0, 2])
point_c = np.array([0, 2])
points = np.stack((point_r, point_c), axis=-1)

result = np.logical_or((idx_test == points[0]).all(axis=1), (idx_test == points[1]).all(axis=1))
print(result)

字符串
输出量:

[ True False False False  True False]

hk8txs48

hk8txs483#

我不知道这对你的用例来说是否足够快,但似乎能产生所需的输出:

point_stack = np.stack((point_r, point_c), axis=-1)

np.any(np.stack((np.all(idx_test == point_stack[0],axis=1),
                 np.all(idx_test == point_stack[1],axis=1)),
                axis=-1),axis=1)

字符串

相关问题