如何根据应用于矩阵的向量选择列? 延期: 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 ]]
答案 0 :(得分:2)
我们可以利用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
对于具有大量行和相当数量的cols的情况,这应该是一个好方法,否则切入每一行并分配NaNs
受相应ar3
值限制。< / p>
对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)
的{{1}}进行比较,得出掩码的每一行。如果我们仔细查看它的所有outer
,直到相应的索引值(ar3值)和False
之后。我们需要True
个地方来分配True
,因此,这个掩码直接帮助我们在整个输出数组中分配NaN。