Python 如何通过列索引列表对numpy数组进行切片

Python 如何通过列索引列表对numpy数组进行切片,python,numpy,slice,Python,Numpy,Slice,我有以下(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.00497

我有以下(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]])
>>> 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)
怎么做?请注意,上面的索引只是示例。实际上,它可能非常不规则,例如第0、第3、第4条。

使用切片:

>>> 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)
如果列索引不规则,则可以执行以下操作:

    array([['1A34', 0.0,  0.0],
           ['1A9N', 0.0456267,  0.331932],
           ['1AQ3', 0.0444479, 0.268581],
           ['1AQ4', 0.0177232,  0.308995]])
>>> 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)

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

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

数组[:,列号]

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

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_数组将第0、第2和第3列作为行

因此,需要对其进行转置,以获得所需格式的输出数组

op_array.transpose()
op_阵列现在将如下所示:

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

这种切片方法采用了“步骤”。但实际上,索引可能非常不规则,例如0、3、4