我有一个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
谢谢!
答案 0 :(得分:2)
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]])
答案 1 :(得分:0)
这应该可以解决问题
error: function(){
...
}, /* Missing here */
success: function(){
...
}
请进行测试,让我知道它是否满足您的要求。它只是反复堆叠rank_vect以匹配RHS上LHS的形状。
我相信这等同于
mat_trans[:,indices] = np.stack((rank_vect,)*indices.size,-1)
我想知道速度差