遍历numpy数组,除了相同的元素

问题描述 投票:0回答:1

我有一个2d的numpy数组,我想对其进行两次迭代。这个想法是对除数组本身以外的每对数组组合执行操作,例如:

a = np.array([[1,2,3,4], [5,6,7,8],[9,0,1,2]])
for i in range(len(a)):
    for j in range(len(a)):
        if i!= j:
            print(a[i]*a[j])

[有人可以帮我通过广播找到一些优雅的numpy解决方案吗?谢谢

python numpy
1个回答
0
投票

我认为您执行此操作的最快方法是对所有对执行该操作,然后仅打印您感兴趣的结果。我假设该操作与您给出的乘法示例一样简单。

我将给出一个使用网格网格处理1d数组的示例,然后将其扩展到2d。

a = np.array([1, 2, 3, 4]
print(a)
>>> array([1, 2, 3, 4])

x, y = np.meshgrid(a, a)
print(x)
>>> array([[1, 2, 3, 4],
           [1, 2, 3, 4],
           [1, 2, 3, 4],
           [1, 2, 3, 4]])
print(y)
>>> array([[1, 1, 1, 1],
           [2, 2, 2, 2],
           [3, 3, 3, 3],
           [4, 4, 4, 4]])

z = x*y
print(z)
>>> array([[ 1,  2,  3,  4],
           [ 2,  4,  6,  8],
           [ 3,  6,  9, 12],
           [ 4,  8, 12, 16]])

现在您要忽略的结果在对角线上,您可以打印每个元素,这样就可以省略它们。

height, width = z.shape
for h in range(height):
    for w in range(width):
        if h == w:
            continue  # Skips this one.
        print(z[h][z])

我不确定为什么要重复两次,所以可能只需要两个打印语句,或更复杂。如果您可以对此发表评论,我可以提出一些建议。

编辑:我看到您添加了一条根本不需要循环的注释。您可以只用print(z)打印整个内容,而忽略您不感兴趣的值,或者如果将这些值传递给其他东西,则可以在此阶段忽略它们。

© www.soinside.com 2019 - 2024. All rights reserved.