获取两个numpy数组之间已更改数据的索引

时间:2011-02-22 04:29:30

标签: python arrays numpy

我有两个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()

2 个答案:

答案 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)