通过指定行和列从另一个数组创建NumPy数组
我该如何创建一个NumPy数组B
,这个数组是另一个NumPy数组A
的子数组,方法是指定要包含哪些行和列(用x
和y
表示)呢?
举个例子:
A = numpy.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]])
x = [0, 2]
y = [1, 3, 4]
B = # Do something .....
应该输出:
>>> B
array([[2, 4, 5], [12, 14, 15]])
3 个回答
0
这里有一种非常详细的方法来实现你想要的:
import numpy as np
a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]])
x = [0, 2]
y = [1,3,4]
a2 = a.tolist()
a3 = [[l for k,l in enumerate(j) if k in y] for i,j in enumerate(a2) if i in x]
b = np.array(a3)
不过请参考一下@ajcr的回答:
import numpy as np
a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]])
x = [0, 2]
y = [1,3,4]
a[x][:,y]
2
你可以使用 np.ix_
这个函数,它可以让你同时处理多个整数索引数组。
>>> A = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]])
>>> x = [0, 2]
>>> y = [1, 3, 4]
>>> A[np.ix_(x, y)]
array([[ 2, 4, 5],
[12, 14, 15]])
根据文档,ix_
这个函数的设计目的是为了让你快速构建索引数组,从而可以获取交叉乘积的结果。比如,使用 a[np.ix_([1,3],[2,5])]
这个表达式,会返回一个数组 [[a[1,2] a[1,5]], [a[3,2] a[3,5]]]
。
6
最好的方法是使用 ix_
函数:详细信息请查看 MSeifert 的回答。
另外,你也可以通过将索引操作串联起来,使用 x
和 y
:
>>> A[x][:,y]
array([[ 2, 4, 5],
[12, 14, 15]])
首先,x
用来选择 A
的行。接着,[:,y]
会根据 y
中的元素来选取子数组的列。
在这种情况下,操作是对称的:如果你愿意,也可以先选择列,使用 A[:,y][x]
。