Python NumPy:在非NaN位置设置NumPy数组的子集

Python NumPy:在非NaN位置设置NumPy数组的子集,python,numpy,Python,Numpy,我有一个数组A(m X n)和另一个数组W(m X n'),其中n'可以与一个非NaN掩码一起使用,该掩码被切片到第一个n'列中,并使用该掩码来选择W中的元素并分配到A的切片部分,如下所示- mask = ~np.isnan(W) A[:,:mask.shape[1]][mask] = W[mask] 样本运行- In [121]: A Out[121]: array([[ 68., 54., 54., 15.], [ 50., 86., 84., 74.],

我有一个数组A(m X n)和另一个数组W(m X n'),其中n'可以与一个非NaN掩码一起使用,该掩码被切片到第一个
n'
列中,并使用该掩码来选择
W
中的元素并分配到
A
的切片部分,如下所示-

mask = ~np.isnan(W)
A[:,:mask.shape[1]][mask] = W[mask]
样本运行-

In [121]: A
Out[121]: 
array([[ 68.,  54.,  54.,  15.],
       [ 50.,  86.,  84.,  74.],
       [ 27.,  39.,  43.,  24.],
       [ 41.,  45.,  42.,  40.],
       [ 32.,  90.,  93.,  19.]])

In [122]: W
Out[122]: 
array([[  3.,   4.],
       [  3.,   1.],
       [  4.,  nan],
       [  6.,   8.],
       [ nan,   6.]])

In [123]: mask = ~np.isnan(W)

In [124]: A[:,:mask.shape[1]][mask] = W[mask]

In [125]: A
Out[125]: 
array([[  3.,   4.,  54.,  15.],
       [  3.,   1.,  84.,  74.],
       [  4.,  39.,  43.,  24.],
       [  6.,   8.,  42.,  40.],
       [ 32.,   6.,  93.,  19.]])

另一种解决方案:

A = np.array([[ 68.,  54.,  54.,  15.],
       [ 50.,  86.,  84.,  74.],
       [ 27.,  39.,  43.,  24.],
       [ 41.,  45.,  42.,  40.],
       [ 32.,  90.,  93.,  19.]])

W = np.array([[  3.,   4.],
       [  3.,   1.],
       [  4.,  np.nan],
       [  6.,   8.],
       [ np.nan,   6.]])   
#replace first two cols of A with W except the positions where W has nan.    
A[:,0:2] = np.where(np.isnan(W),A[:,0:2],W)
print(A)

[[  3.   4.  54.  15.]
 [  3.   1.  84.  74.]
 [  4.  39.  43.  24.]
 [  6.   8.  42.  40.]
 [ 32.   6.  93.  19.]]

谢谢超级有用!
A = np.array([[ 68.,  54.,  54.,  15.],
       [ 50.,  86.,  84.,  74.],
       [ 27.,  39.,  43.,  24.],
       [ 41.,  45.,  42.,  40.],
       [ 32.,  90.,  93.,  19.]])

W = np.array([[  3.,   4.],
       [  3.,   1.],
       [  4.,  np.nan],
       [  6.,   8.],
       [ np.nan,   6.]])   
#replace first two cols of A with W except the positions where W has nan.    
A[:,0:2] = np.where(np.isnan(W),A[:,0:2],W)
print(A)

[[  3.   4.  54.  15.]
 [  3.   1.  84.  74.]
 [  4.  39.  43.  24.]
 [  6.   8.  42.  40.]
 [ 32.   6.  93.  19.]]