numpy 如何根据条件将矩阵中的值转换为向量中相应的行值

iyfjxgzm  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(136)

我想知道是否可以用纯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问题中解决的那样。

voase2hg

voase2hg1#

为什么不使用np.where

>>> np.where(a < 3, b, 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]])
h7wcgrx3

h7wcgrx32#

使用a < 3作为掩码,b作为fill_value,得到掩码值的初始数组filled

a = np.ma.array(a, mask=a < 3, fill_value=b).filled()
print(a)
[[ 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]]

相关问题