Numpy / Python:没有for循环的数组迭代

时间:2012-12-10 16:44:38

标签: python arrays numpy indexing slice

所以这是另一个n维数组问题: 我希望能够将n维数组中的每个值与其邻居进行比较。例如,如果a是我希望能够检查的二维数组:

a[y][x]==a[y+1][x]

所有元素。所以基本上检查所有维度的所有邻居。现在我通过以下方式做到:

for x in range(1,a.shape[0]-1):
   do.something(a[x])

使用数组的形状,这样我就不会在边缘处遇到超出范围的索引。因此,如果我想在n-D中对数组中的所有元素执行类似的操作,我确实需要n个for循环,这似乎是不整齐的。有没有办法通过切片这样做?有点像== a [:, - 1,:]还是我理解这完全错了?有没有办法告诉切片最后停止?还是会有另一种想法让事情以另一种方式发挥作用?蒙面阵列? 迎接Joni

3 个答案:

答案 0 :(得分:5)

类似的东西:

a = np.array([1,2,3,4,4,5])
a == np.roll(a,1)

返回

array([False, False, False, False,  True, False], dtype=bool

你也可以为更高的尺寸指定一个轴,但是正如其他人所说的那样,你需要以值的形式处理边缘(正如你可以从名称中猜出的那样)

在2D中有更全面的例子:

# generate 2d data
a = np.array((np.random.rand(5,5)) * 10, dtype=np.uint8)

# check all neighbours
for ax in range(len(a.shape)):
    for i in [-1,1]:
        print a == np.roll(a, i, axis=ax)

答案 1 :(得分:2)

这可能也很有用,它会将每个元素与下一个元素进行比较,沿轴= 1。你可以明显地调整轴或距离。诀窍是确保==运算符的两边具有相同的形状。

a[:, :-1, :] == a[:, 1:, :]

答案 2 :(得分:0)

如何:

np.diff(a) != 0

如果您需要另一个轴中的邻居,可能会将np.swapaxes(a)的结果区别开来并以某种方式将结果合并在一起?