【问题标题】:How to slice a numpy array by a list of column indices如何通过列索引列表对 numpy 数组进行切片
【发布时间】:2014-07-01 08:58:03
【问题描述】:

我有以下 (4x8) numpy 数组:

In [5]: z
Out[5]: 
array([['1A34', 'RBP', 0.0, 1.0, 0.0, 0.0, 0.0, 0.0],
       ['1A9N', 'RBP', 0.0456267, 0.0539268, 0.331932, 0.0464031,
        4.41336e-06, 0.522107],
       ['1AQ3', 'RBP', 0.0444479, 0.201112, 0.268581, 0.0049757,
        1.28505e-12, 0.480883],
       ['1AQ4', 'RBP', 0.0177232, 0.363746, 0.308995, 0.00169861, 0.0,
        0.307837]], dtype=object)

In [6]: z.shape
Out[6]: (4, 8)

我要做的是提取上述数组的第0、2、4列 生成 (4 x 3) 数组,如下所示:

    array([['1A34', 0.0,  0.0],
           ['1A9N', 0.0456267,  0.331932],
           ['1AQ3', 0.0444479, 0.268581],
           ['1AQ4', 0.0177232,  0.308995]])

有什么办法呢?请注意,上述索引只是示例。实际上,它可能非常不规则,例如0、3、4。

【问题讨论】:

    标签: python numpy slice


    【解决方案1】:

    使用切片:

    >>> arr = np.array([['1A34', 'RBP', 0.0, 1.0, 0.0, 0.0, 0.0, 0.0],
           ['1A9N', 'RBP', 0.0456267, 0.0539268, 0.331932, 0.0464031,
            4.41336e-06, 0.522107],
           ['1AQ3', 'RBP', 0.0444479, 0.201112, 0.268581, 0.0049757,
            1.28505e-12, 0.480883],
           ['1AQ4', 'RBP', 0.0177232, 0.363746, 0.308995, 0.00169861, 0.0,
            0.307837]], dtype=object)
    >>> arr[:,:5:2]
    array([['1A34', 0.0, 0.0],
           ['1A9N', 0.0456267, 0.331932],
           ['1AQ3', 0.0444479, 0.268581],
           ['1AQ4', 0.0177232, 0.308995]], dtype=object)
    

    如果列索引不规则,那么你可以这样做:

    >>> indices = [0, 3, 4]
    >>> arr[:, indices]
    array([['1A34', 1.0, 0.0],
           ['1A9N', 0.0539268, 0.331932],
           ['1AQ3', 0.201112, 0.268581],
           ['1AQ4', 0.363746, 0.308995]], dtype=object)
    

    请注意,切片(即basic indexing)和使用序列索引(也称为advanced indexing 或花式索引)之间存在细微但实质性的区别。当使用像arr[:, :5:2] 这样的切片时,不会复制任何数据,我们会得到原始数组的视图。这意味着改变arr[:, :5:2] 的结果将影响arr 本身。用花哨的索引arr[:, [0, 3, 4]] 保证是一个副本:这会占用更多的内存,并且改变这个结果不会影响arr

    【讨论】:

    • 该切片方法假定“步骤”。但实际上,索引可能非常不规则,例如0日、3日、4日
    【解决方案2】:

    您可以通过以下方式访问 numpy 数组的列:

    数组[:,column_number]

    要获取特定列的数组,您可以执行以下操作:

    z = array([[['1A34', 'RBP', 0.0, 1.0, 0.0, 0.0, 0.0, 0.0],
       ['1A9N', 'RBP', 0.0456267, 0.0539268, 0.331932, 0.0464031,
        4.41336e-06, 0.522107],
       ['1AQ3', 'RBP', 0.0444479, 0.201112, 0.268581, 0.0049757,
        1.28505e-12, 0.480883],
       ['1AQ4', 'RBP', 0.0177232, 0.363746, 0.308995, 0.00169861, 0.0,
        0.307837]], dtype=object]) #your array here
    
    op_array = array([ [z:,0], z[:,2], z[:,3] ])
    

    op_array 将第 0、第 2 和第 3 列作为行。

    所以你需要转置它以获得所需格式的输出数组。

    op_array.transpose()
    

    op_array 现在将如下所示:

    op_array([['1A34', 0.0,  0.0],
           ['1A9N', 0.0456267,  0.331932],
           ['1AQ3', 0.0444479, 0.268581],
           ['1AQ4', 0.0177232,  0.308995])
    

    【讨论】:

      猜你喜欢
      • 2017-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 2015-02-11
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      相关资源
      最近更新 更多