繁体   English   中英

numpy python - 同时切片行和列

[英]numpy python - slicing rows and columns at the same time

我有一个 130 X 13 的 numpy 矩阵。假设我想 select 一组满足条件的特定行和列的子集-

trainx[trainy==label,[0,6]]

上面的代码不起作用并引发错误 - IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (43,) (2,).

但是,如果我分两步进行 - 首先是子集行,然后是列,它可以工作。 是不是有些奇怪或 numpy 以这种方式工作?

temp1 = trainx[trainy==label,:]
temp1 = temp1[:,[0,6]]

您可以简单地将索引链接起来

trainx[trainy==label][:, [0,6]]

可运行示例

arr = np.random.rand(130,13)
arr[arr[:,0]>0.5][:, [0,6]]
In [154]: x = np.arange(24).reshape(6,4)                                        
In [155]: mask = np.array([1,0,1,0,1,0],bool)

使用您的两步方法:

In [156]: x[mask]                 # x[mask, :]                                                              
Out[156]: 
array([[ 0,  1,  2,  3],
       [ 8,  9, 10, 11],
       [16, 17, 18, 19]])
In [157]: x[mask][:,[1,3]]                                                      
Out[157]: 
array([[ 1,  3],
       [ 9, 11],
       [17, 19]])

或者这两个索引可以与ix_结合使用:

In [158]: np.ix_(mask, [1,3])                                                   
Out[158]: 
(array([[0],
        [2],
        [4]]), array([[1, 3]]))
In [159]: x[np.ix_(mask, [1,3])]                                                
Out[159]: 
array([[ 1,  3],
       [ 9, 11],
       [17, 19]])

请注意, Out[158]中的第一个数组是np.nonzero(mask)[0][:,None] ,即列向量形式的非零索引。 该 (3,1) 索引数组可以与 (2,) 列数组一起广播到 select 一个 (3,2) 元素数组。 或者在您的示例中为 (43,2) 数组。

boolean mask不能转为 (6,1) 数组并用于掩码x 这只有在变成 (6,4) 掩码时才有效,与x的形状相匹配。

所以要么使用两步索引,要么使用ix_

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM