Python:在一个新数组中选择二维数组的特定行的优雅方法是什么?

时间:2012-03-09 05:42:14

标签: python arrays

例如,给定一个python numpy.ndarray a = array([[1, 2], [3, 4], [5, 6]]),我想选择数组a的第0行和第2行到新数组b,这样{{1} }变成b

我需要解决方案来处理更常见的问题,其中原始的2d数组可以有更多的行,我应该能够根据一些不相交的范围选择行。一般来说,我一直在寻找适用于一维列表的array([[1,2],[5,6]]之类的东西,但似乎2d阵列不会这样添加。

更新 似乎我可以使用a[i:j] + a[k:p]来实现这一点,但有没有优雅的方法来做到这一点?

2 个答案:

答案 0 :(得分:5)

您可以使用列表索引:

a[ [0,2], ]

更一般地说,选择行i:jk:p(我假设在python意义上,意思是行i到j但不包括j):

a[ range(i,j) + range(k,p)   , ]

请注意,range(i,j) + range(k,p)会创建[ i, i+1, ..., j-1, k, k+1, ..., p-1 ] flat 列表,然后将其用于索引a的行。

答案 1 :(得分:2)

numpy在索引方面有点聪明。你可以给它一个索引列表,它将返回切片部分。

In : a = numpy.array([[i]*10 for i in range(10)])

In : a
Out:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
       [3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
       [4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
       [5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
       [6, 6, 6, 6, 6, 6, 6, 6, 6, 6],
       [7, 7, 7, 7, 7, 7, 7, 7, 7, 7],
       [8, 8, 8, 8, 8, 8, 8, 8, 8, 8],
       [9, 9, 9, 9, 9, 9, 9, 9, 9, 9]])

In : a[[0,5,9]]
Out:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
       [9, 9, 9, 9, 9, 9, 9, 9, 9, 9]])

In : a[range(0,2)+range(5,8)]
Out:
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
       [6, 6, 6, 6, 6, 6, 6, 6, 6, 6],
       [7, 7, 7, 7, 7, 7, 7, 7, 7, 7]])