使用不同的值数组进行Numpy元素比较



这可能是一个简单的问题,但我被这个问题卡住了,我找到的解决方案效率不高(我认为(。

假设我有两个numpy数组,一个包含每个位置的索引,另一个包含有效索引:

import numpy as np
x = np.array([0, 1, 2, 1, 3, 2])
indices = np.array([True, True, False, False])

我想得到一个布尔数组,指示第一个数组中的值与第二个数组中包含的值相同。正如我所提到的,我的解决方案是无效的:

indices2 = np.where(indices)[0]
y1 = (x == indices2[0]) | (x == indices2[1])
y2 = np.zeros_like(x, dtype=bool)
for i in indices2:
y2 = (x == i) | y2
np.all(y2 == y1) 

真实

y1 

数组([True,True,False,True,False](

那么,有没有更高效、更numpy风格的方法来实现这一点(例如,没有for循环(?

编辑:
更正了一些错误,并将示例替换为注释中提到的较小示例。

您似乎想用x中的索引对indices进行索引。试用:

indices[x]

下面是我解决这个问题的方法:

import numpy as np
x = np.array([0, 0, 2, 0, 3, 0, 1, 0, 0, 0, 0, 0, 3, 0, 3, 1, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 3, 0, 3, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 2, 0, 1, 0, 0, 0, 2, 0, 2, 2, 0, 2,
0, 0, 2, 2, 0, 2, 2, 0, 2, 0, 0, 2])
indices = [True, True, False, False]
x2 = np.copy(x)
x2 = np.array(x2,dtype='object')
for i,val in enumerate(x):
x2[i] = indices[val]

print(x2)

如果以后不需要x,那么可以只使用x = np.array(x,dtype='object'),而不使用单独的变量x2


输出:

[True True False True False True True True True True True True False True
False True True True True True True True True True True True True True
False True False True True True True True False True True True True True
True True True True True True True True True True True True True True
True True True True True True True True True True True True True True
True True True False True True False True True True True True False True
False False True False True True False False True False False True False
True True False]

编辑:

当测试5000次时,上述代码平均花费0.12967189999994844秒,Roberto的代码花费0.05755720000001929秒。所以你应该更喜欢他的代码。

最新更新