比较多维numpy数组中相邻元素的最快方法

时间:2014-06-03 21:50:43

标签: numpy

比较三维数组中相邻元素的最快方法是什么?

假设我有一个(4,4,4)的numpy数组。我想在k方向上循环并成对比较元素。因此,比较所有相邻元素并分配最低索引(如果它们不相等)。基本上就是这样:

if array([0, 0, 0)] != array[(0, 0, 1)]:
    array[(0, 0, 0)] = 111

因此,比较将是:

(0, 0, 0) and (0, 0, 1)
(0, 0, 1) and (0, 0, 2)
(0, 0, 2) and (0, 0, 3)
(0, 0, 3) and (0, 0, 4)
... for all i and j ...

但是,我想为数组中的每个i和j执行此操作,并在具有数百万个单元的大型数组上为此循环编写标准Python非常慢。如果没有明确的for循环,是否有更“标准”的numpy方式呢?

也许使用切片步骤有一些技巧(即array[:,:,::2], array[:,:,1::2])?

1 个答案:

答案 0 :(得分:4)

尝试np.diff

import numpy as np
a = np.arange(9).reshape(3, 3)
A = np.array([a, a, a + 1]).T

same_with_neighbor_on_last_axis = np.diff(A, axis=-1) == 0

print A
print same_with_neighbor_on_last_axis

A被构造成沿第三轴具有2个连续的相等条目,

>>>print A
array([[[0, 0, 1],
        [3, 3, 4],
        [6, 6, 7]],

       [[1, 1, 2],
        [4, 4, 5],
        [7, 7, 8]],

       [[2, 2, 3],
        [5, 5, 6],
        [8, 8, 9]]])

然后输出向量产生

>>>print same_with_neighbor_on_last_axis
[[[ True False]
  [ True False]
  [ True False]]

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

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

使用axis关键字,您可以选择执行此操作所需的轴。如果是全部,则可以使用循环。 np.diff除了以下

之外别无其他
np.diff(A, axis=-1) == A[..., 1:] - A[..., :-1]