Python 通过指定行和列,从另一个数组创建NumPy数组

Python 通过指定行和列,从另一个数组创建NumPy数组,python,arrays,numpy,Python,Arrays,Numpy,如何通过指定要包括哪些行和列(分别由x和y指示),创建一个NumPy数组B,它是NumPy数组a的子数组 例如: 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]]) 执行此操作的最佳方法是

如何通过指定要包括哪些行和列(分别由
x
y
指示),创建一个NumPy数组
B
,它是NumPy数组
a
的子数组

例如:

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

执行此操作的最佳方法是使用
ix
功能:有关详细信息,请参阅

或者,您可以使用
x
y
链接索引操作:

>>> A[x][:,y]
array([[ 2,  4,  5],
       [12, 14, 15]])
第一个
x
用于选择
A
的行。接下来,
[:,y]
选择由
y
的元素指定的子数组的列


在这种情况下,链接是对称的:如果愿意,您也可以使用
A[:,y][x]
首先选择列。

这里有一个超级详细的方法来获取您想要的内容:

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]
您可以使用允许广播整数索引数组的:

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


请注意,这不是一个新数组,而是原始数组的一个视图,使用内存中的相同数据。这实际上是一个新数组-奇特的索引(即使用一个值数组,而不是单个值或切片)触发复制。