如何根据应用于矩阵的向量选择列? 扩大: How to apply mask from array to another matrix in numpy
ar2 = np.arange(1,26)[::-1].reshape([5,5]).T
ar3 = np.array([1,2,3,1,2])
print (ar2, '\n\n', ar3)
results in:
[[25 20 15 10 5]
[24 19 14 9 4]
[23 18 13 8 3]
[22 17 12 7 2]
[21 16 11 6 1]]
[1 2 3 1 2]
我追求的是:
1 [[ 25 np.nan np.nan np.nan np.nan]
2 [ 24 19 np.nan np.nan np.nan]
3 [ 23 18 13 np.nan np.nan]
1 [ 22 np.nan np.nan np.nan np.nan]
2 [ 21 16 np.nan np.nan np.nan ]]
最佳答案
我们可以利用 broadcasting
创建带有与 ar3
比较的范围数组的掩码用于分配到这些位置,然后分配 NaNs
。因为,输入是 int
数组,我们需要制作 ar2
的浮点副本然后分配,就像这样 -
out = ar2.astype(float, copy=True) # convert to float as NaNs are to be assigned
mask = ar3[:,None] <= np.arange(ar2.shape[1])
out[mask] = np.nan
对于具有大量行和相当多列的情况,这应该是一个很好的方法,否则切片到每一行并分配 NaNs
受相应ar3
限制值。
关于mask
的更多解释创作-
In [38]: ar3
Out[38]: array([1, 2, 3, 1, 2])
In [39]: ar3[:,None] <= np.arange(ar2.shape[1])
Out[39]:
array([[False, True, True, True, True],
[False, False, True, True, True],
[False, False, False, True, True],
[False, True, True, True, True],
[False, False, True, True, True]])
比较 ar3
的每个元素与 range(5)
与此outer
比较给出了掩码的每一行。如果我们仔细观察的话,都是False
直到对应的索引值(ar3值)和True
此后。我们需要那些True
分配位置NaNs
因此,这个掩码直接帮助我们在整个输出数组中分配 NaN。
关于arrays - 如何使用另一个向量的值从 numpy 矩阵中选择列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50257228/