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]