如何使用另一个向量中的值从numpy中的矩阵中选择列

时间:2018-05-09 15:39:49

标签: arrays python-3.x numpy

如何根据应用于矩阵的向量选择列? 延期: 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 ]] 

1 个答案:

答案 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。