我对是否可以使用纯 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 first
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 question.
使用
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]]