【问题标题】:numpy python - slicing rows and columns at the same timenumpy python - 同时切片行和列
【发布时间】:2019-10-30 03:28:43
【问题描述】:

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

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

【问题讨论】:

  • trains.loc[...,...] ?
  • 两步索引可能是最容易理解和使用的,尤其是当行索引是布尔掩码时..
  • 我假设 trainy 是 (130,) 形状,对吧?

标签: python numpy slice


【解决方案1】:

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

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

可运行示例

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

【讨论】:

  • 这不适用于二维数组和布尔行掩码。
  • 谢谢。链接工作。对于我的具体示例 - trainx[trainy==label,:][:,[0,6]]
【解决方案2】:
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,) 列数组一起广播以选择 (3,2) 元素数组。或者在您的示例中为 (43,2) 数组。

布尔值mask不能转成(6,1)数组用来屏蔽x;只有当它变成一个 (6,4) 掩码,匹配x 的形状时,它才会起作用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2011-08-30
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多