如何按照列索引列表对numpy数组进行切片

4

I have the following (4x8) numpy array:

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个回答

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个、第3个、第4个。 - neversaint

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接