如何通过列索引列表对numpy数组进行分片?

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

我有以下(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×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
2个回答
8
投票

使用分片法。

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

请注意,切片和分片之间有一个微妙但实质上的区别。基本索引),并使用序列进行索引(也称为 高级索引 或花式索引)。) 当使用一个分片,如 arr[:, :5:2],没有数据被复制,我们得到的是一个 观点 的结果。这意味着,将 arr[:, :5:2] 会影响 arr 本身。有了花哨的索引 arr[:, [0, 3, 4]] 保证是一个副本:这样会占用更多的内存,而突变这个结果不会影响到 arr.


0
投票

你可以通过以下方式访问numpy数组的列。

array[:,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])
© www.soinside.com 2019 - 2024. All rights reserved.