Python 模式匹配相乘
我有以下格式的矩阵:Python 模式匹配相乘,python,numpy,matrix,pattern-matching,Python,Numpy,Matrix,Pattern Matching,我有以下格式的矩阵: matrix = np.array([1, 2, 3, np.nan], [1, np.nan, 3, 4], [np.nan, 2, 3, np.nan]) 系数,我想有选择地用矩阵乘以元素: coefficients = np.array([0.5, np.nan, 0.2, 0.3], [0.3, 0.3, 0.2, np.nan],
matrix = np.array([1, 2, 3, np.nan],
[1, np.nan, 3, 4],
[np.nan, 2, 3, np.nan])
系数,我想有选择地用矩阵乘以元素:
coefficients = np.array([0.5, np.nan, 0.2, 0.3],
[0.3, 0.3, 0.2, np.nan],
[np.nan, 0.2, 0.1, np.nan])
在这种情况下,我希望矩阵
中的第一行与系数
中的第二行相乘,而矩阵
中的第二行与系数
中的第一行相乘。简言之,我想在系数
中选择与矩阵
中的行相匹配的行,以确定np.nan
值的位置
np.nan
值的位置对于系数
中的每一行都是不同的,因为它们描述了不同数据可用性情况下的系数
有没有一种快速的方法可以做到这一点,即不需要为所有可能的情况编写if语句?方法#1
一个快速的方法是-
给定样本数据的输出-
In [40]: out
Out[40]:
array([[ 0.3, 0.6, 0.6, nan],
[ 0.5, nan, 0.6, 1.2],
[ nan, 0.4, 0.3, nan]])
方法#2
为了提高性能,将NaNs掩码的每一行减少到其十进制等价物,然后创建一个存储数组,在该数组中,我们可以存储矩阵
中的元素,然后将这些十进制等价物索引的系数
中的元素相乘-
R = 2**np.arange(matrix.shape[1])
idx1 = mask1.dot(R)
idx2 = mask2.dot(R)
A = np.empty((idx1.max()+1, matrix.shape[1]))
A[idx1] = matrix
A[idx2] *= coefficients
out = A[idx1]
你能解释一下mask1[:,None]==mask2在做什么吗?@galliwuzz添加了评论。
R = 2**np.arange(matrix.shape[1])
idx1 = mask1.dot(R)
idx2 = mask2.dot(R)
A = np.empty((idx1.max()+1, matrix.shape[1]))
A[idx1] = matrix
A[idx2] *= coefficients
out = A[idx1]