如何通过列索引列表切片numpy数组

4 投票
2 回答
5369 浏览
提问于 2025-04-18 11:41

我有一个这样的 (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列。

2 个回答

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

撰写回答