numpy python-同时切片行和列

问题描述 投票:0回答:2

我有一个130 X 13的numpy矩阵。假设我要选择一组满足条件的特定行和一列列-

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

以上代码无效,并引发错误-IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (43,) (2,).

但是,如果我分两步进行-首先是行的子集,然后是列,则可以。这样很奇怪还是很麻木?

temp1 = trainx[trainy==label,:]
temp1 = temp1[:,[0,6]]
python numpy slice
2个回答
0
投票

您可以像这样简单地链接索引

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

可运行示例

arr = np.random.rand(130,13)
arr[arr[:,0]>0.5][:, [0,6]]

0
投票
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],这是列矢量形式的非零索引。

© www.soinside.com 2019 - 2024. All rights reserved.