我有两个3d numpy数组a1和a2 len(a1) == len(a2)
和a1[x, y, z] = id
我正在使用此代码来确定z层中是否有任何更改的数据
eq = a1 == a2
if eq.any():
#find the indexes of the changed data
因为评论和标题说我需要找到已更改数据的索引。 基本上我有一个对应的列表对应阵列中的位置,我需要根据从数组中拉出的id来更新这些对象。我想尽快做到这一点,因为这个列表可能真的很大,可能超过120,000个条目。但这些条目中只有一百左右可能会在任何时候发生变化。因此,我想获取已更改索引的列表,以便我可以在该索引处调用该对象并进行更新。
我确实需要维护索引的三个组件
有没有办法在不循环列表的情况下执行此操作?也许是numpy.nonzero()
答案 0 :(得分:4)
还有两个选择:
np.argwhere(a1!=a2)
np.where(a1!=a2)
它们都做同样的事情,但产生不同格式的结果(一个适合索引数组,另一个更可读)
答案 1 :(得分:1)
我不明白你问题的具体细节(例如,数组的大小/形状);这个解决方案应该足够通用了。无论如何,它是无环路的:
# two 2d arrays
x = NP.random.randint(0, 10, 20).reshape(5, 4)
y = NP.random.randint(0, 10, 20).reshape(5, 4)
ndx1, ndx2 = NP.nonzero((x - y))
# all indices in which the values of x & y differ, each index is a tuple
ndx = zip(ndx1, ndx2)
# you can also use argwhere, returns each index as a 1d array vs. tuple:
NP.argwhere(dxy)
# finally, just generating an array the same size as the diff array with e.g.,
# '1' for each diff element and '0' for each non-diff:
dxy = x - y
NP.where(dxy=0, 0, 1)