基于条件替换Python NumPy矩阵的值,不使用for循环。

3

我有一个对称的numpy矩阵,例如:

matrix([[0.   , 0.125, 0.75 , 0.   , 0.   ],
        [0.125, 0.   , 0.   , 0.   , 0.   ],
        [0.75 , 0.   , 0.   , 0.   , 0.375],
        [0.   , 0.   , 0.   , 0.   , 1.2  ],
        [0.   , 0.   , 0.375, 1.2  , 0.   ]])

如果数组中的一个值大于零,是否可以将该值替换为给定行和列的总和的乘积。例如,0.125将被替换为0.109375,因为row_sum * col_sum = 0.125*(0.125+0.75)=0.109375。

我知道可以使用for循环来完成,但是否可以使用标准的numpy库来完成,因为我想避免使用for循环。


怎么样?np. matmul(np.ones(matrix.shape), matrix) * np.matmul(matrix, np.ones(matrix.shape)) - albusSimba
2个回答

2
声明给定的矩阵
import numpy as np
arr=np.array([[0.   , 0.125, 0.75 , 0.   , 0.   ],
            [0.125, 0.   , 0.   , 0.   , 0.   ],
            [0.75 , 0.   , 0.   , 0.   , 0.375],
            [0.   , 0.   , 0.   , 0.   , 1.2  ],
            [0.   , 0.   , 0.375, 1.2  , 0.   ]])

使用列表推导式和np.argwhere来获取条件索引:
def replace(x,y,arr=arr,column_sums=arr.sum(axis=0),row_sum=arr.sum(axis=1)):
    arr[x][y]=row_sum[x]*column_sums[y]

_=[replace(x,y) for x,y in np.argwhere(arr>0)]

输出结果:
array([[0.      , 0.109375, 0.984375, 0.      , 0.      ],
       [0.109375, 0.      , 0.      , 0.      , 0.      ],
       [0.984375, 0.      , 0.      , 0.      , 1.771875],
       [0.      , 0.      , 0.      , 0.      , 1.89    ],
       [0.      , 0.      , 1.771875, 1.89    , 0.      ]])

请注意,代码可以更加优化以便更好地理解。

0

使用numpy的索引功能怎么样?

arr[arr > 0] = x

那么我该如何自定义引用每个索引元素以获取相关总和的行和列? - Paws

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接