gpt4 book ai didi

python - 在没有for循环的情况下比较Numpy中两个3D矩阵的数组

转载 作者:太空宇宙 更新时间:2023-11-03 11:14:14 25 4
gpt4 key购买 nike

所有 Numpy 专家,这对你们来说可能非常简单。这个问题应该存在,但我没有找到确切的解决方法。类似的是 Comparing two matrices row-wise by occurrence in NumPyNumpy compare array to multiple scalars at once但不完全在那里。

我需要为多维数组计算 numpy.array_equal,但我很确定我不需要使用双 for 循环。但是,如果我使用双 for 循环进行计算,它将如下所示:

M = numpy.array(
[
[
[1,2,3],
[1,3,4]
],
[
[3,4,5],
[1,2,3]
],
[
[1,2,3],
[1,3,4]
]
])

result = np.zeros((M.shape[0], M.shape[0]))
for i in range(M.shape[0]):
for j in range(M.shape[0]):
result[i,j] = numpy.array_equal(M[i], M[j])

我最终应该得到一个 M.shape[0]^2 大型真值表,其中至少对角线为真。

最佳答案

杠杆 broadcasting扩展后 -两个 4D 版本的输入,这样我们就可以沿第一个轴比较 pairiwise-array-blocks,同时保持最后两个轴对齐 -

result = (M[:,None] == M).all((2,3))

我们可以使用最后两个轴作为 .all() 的输入将其扩展到通用的 n-dim 数组情况 -

(M[:,None] == M).all((-2,-1))

利用 views 提高内存效率,从而提高性能 -

# https://stackoverflow.com/a/44999009/ @Divakar
def view1D(a): # a is array
a = np.ascontiguousarray(a)
void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
return a.view(void_dt).ravel()

M1D = view1D(M.reshape(M.shape[0],-1))
result = M1D[:,None] == M1D

大型阵列上的计时 -

In [48]: np.random.seed(0)
...: M = np.random.randint(0,10,(100,100,100))

In [49]: %timeit (M[:,None] == M).all((-2,-1))
10 loops, best of 3: 92.2 ms per loop

In [50]: %%timeit
...: M1D = view1D(M.reshape(M.shape[0],-1))
...: M1D[:,None] == M1D
1000 loops, best of 3: 627 µs per loop

原来的一个-

In [54]: %%timeit
...: result = np.zeros((M.shape[0], M.shape[0]))
...: for i in range(M.shape[0]):
...: for j in range(M.shape[0]):
...: result[i,j] = numpy.array_equal(M[i], M[j])
10 loops, best of 3: 125 ms per loop

结论是 - 删除循环,但要注意内存使用情况。如果可能,找到其他方法来保持向量化和内存高效。

关于python - 在没有for循环的情况下比较Numpy中两个3D矩阵的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54768718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com