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

标签 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 ]] 

最佳答案

我们可以利用 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/

相关文章:

C - 访问结构数组

Python程序,方便用户查询

python - 使用重复索引递增 Numpy 多维数组

python - 计算 torch 张量数组的平均值和标准差

excel - 使用 Python 突出显示 Excel 中的单元格

python - 如何使用 Portable Python 安装外部库?

arrays - 如何创建和编辑准备好通过 UDP 序列化的二进制数据数组?

c++ - 检查数组是否包含字符

c++ - 将 C++11 数组与 Cython 接口(interface)

python - 将 Autocomplete=off 应用到 Django 密码重置确认表单