比较三维数组中相邻元素的最快方法是什么?
假设我有一个(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]
)?
答案 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]