首页 > 解决方案 > 修改数组numpy中的多列

问题描述

我有一个 numpy 数组(nxn 矩阵),我只想修改总和为 0 的列。我想为所有这些列分配相同的值。为此,我首先采用总和为 0 的列的索引:

sum_lines = np.sum(mat_trans, axis = 0)
indices = np.where(sum_lines == 0)[0]

然后我对这些索引做了一个循环:

for i in indices:
    mat_trans[:, i] = rank_vect

这样每个列现在都具有 rank_vect 列向量的值。

我想知道是否有办法在没有循环的情况下做到这一点,看起来像:

mat_trans[:, (np.where(sum_lines == 0)[0]))] = rank_vect

谢谢!

标签: pythonarraysnumpy

解决方案


In [114]: arr = np.array([[0,1,2,3],[1,0,2,-3],[-1,2,0,0]])

In [115]: sumlines = np.sum(arr, axis=0)
In [116]: sumlines
Out[116]: array([0, 3, 4, 0])

In [117]: idx = np.where(sumlines==0)[0]
In [118]: idx
Out[118]: array([0, 3])

所以我们要修改的列是:

In [119]: arr[:,idx]
Out[119]: 
array([[ 0,  3],
       [ 1, -3],
       [-1,  0]])

In [120]: rv = np.array([10,11,12])

如果rv是 1d,我们会得到一个形状错误:

In [121]: arr[:,idx] = rv
ValueError: shape mismatch: value array of shape (3,) could not be broadcast to indexing result of shape (2,3)

但是如果它是一个列向量(形状(3,1))它可以广播到(3,2)目标:

In [122]: arr[:,idx] = rv[:,None]

In [123]: arr
Out[123]: 
array([[10,  1,  2, 10],
       [11,  0,  2, 11],
       [12,  2,  0, 12]])

推荐阅读