Python:what';将二维数组中的特定行选择到新数组中是一种优雅的方法吗?
例如,给定一个python numpy.ndarrayPython:what';将二维数组中的特定行选择到新数组中是一种优雅的方法吗?,python,arrays,Python,Arrays,例如,给定一个python numpy.ndarraya=array([[1,2],[3,4],[5,6]]),我想将数组a的第0行和第2行选择到一个新数组b,这样b就变成数组([[1,2],[5,6]]) 我需要解决更一般的问题,原始2d数组可以有更多的行,我应该能够根据一些不相交的范围选择行。一般来说,我在寻找类似于a[I:j]+a[k:p]的东西,它适用于一维列表,但似乎2d数组不会以这种方式相加 更新 似乎我可以使用vstack((a[I:j],a[k:p])来实现这一点,但是有什么优雅
a=array([[1,2],[3,4],[5,6]])
,我想将数组a
的第0行和第2行选择到一个新数组b
,这样b
就变成数组([[1,2],[5,6]]
)
我需要解决更一般的问题,原始2d数组可以有更多的行,我应该能够根据一些不相交的范围选择行。一般来说,我在寻找类似于a[I:j]+a[k:p]
的东西,它适用于一维列表,但似乎2d数组不会以这种方式相加
更新
似乎我可以使用
vstack((a[I:j],a[k:p])
来实现这一点,但是有什么优雅的方法可以做到这一点吗?您可以使用列表索引:
a[ [0,2], ]
更一般地说,要选择行i:j
和k:p
(我假设是python意义上的,意思是行i到j,但不包括j):
请注意,
range(i,j)+range(k,p)
创建了一个[i,i+1,…,j-1,k,k+1,…,p-1]
的平面列表,然后用它来索引a
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]])
+1不过,我发现元组通常看起来不那么奇怪。
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]])