2

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

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

对于所有元素。所以基本上检查所有维度的所有邻居。现在我正在通过以下方式进行:

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

使用了数组的形状,这样我就不会在边缘遇到超出范围的索引。因此,如果我想在 nD 中对数组中的所有元素执行类似的操作,我确实需要 n 个 for 循环,这似乎是不整洁的。有没有办法通过切片来做到这一点?像 a==a[:,-1,:] 这样的东西还是我完全理解错了?有没有办法告诉切片在最后停止?或者是否会有另一种想法让事情以完全不同的方式工作?屏蔽数组?问候乔尼

4

3 回答 3

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)
于 2012-12-10T16:46:11.587 回答
2

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

a[:, :-1, :] == a[:, 1:, :]
于 2012-12-10T18:21:05.473 回答
0

怎么样:

np.diff(a) != 0

?

如果您需要另一个轴上的邻居,也许可以区分 np.swapaxes(a) 的结果并以某种方式将结果合并在一起?

于 2012-12-10T17:26:27.307 回答