我想知道是否可以用纯numpy做下面的事情,假设我有一个矩阵a和一个向量b,我想用向量b中对应于矩阵a中的行的值来填充等号左边的所有满足条件的值。
import numpy as np
a = np.arange(30).reshape(5,6)
a[3,3] = 2
a[4,0] = 1
a
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 2, 22, 23],
[ 1, 25, 26, 27, 28, 29]])
b = np.arange(0,5)[:,None]
b
array([[0],
[1],
[2],
[3],
[4]])
a[a<3] = b
TypeError:NumPy布尔数组索引分配需要0或1维输入,输入有2维
我明白为什么这不起作用,我需要将B重塑为与a相同的形状,然后首先将其子集a〈3
b_mat = np.full(a.shape, b)
a[a<3] = b_mat[a<3]
a
array([[ 0, 0, 0, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17],
[18, 19, 20, 3, 22, 23],
[ 4, 25, 26, 27, 28, 29]])
然而,我想知道,有没有一种方法可以在numpy中优雅地做到这一点,而不必将一维向量B变成一个所有行都重复的矩阵?
在Pandas中有一种方法可以做到这一点,就像在this问题中解决的那样。
2条答案
按热度按时间voase2hg1#
为什么不使用
np.where
?h7wcgrx32#
使用
a < 3
作为掩码,b
作为fill_value
,得到掩码值的初始数组filled: