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

4 投票
3 回答
18180 浏览
提问于 2025-04-28 20:56

我该如何创建一个NumPy数组B,这个数组是另一个NumPy数组A的子数组,方法是指定要包含哪些行和列(用xy表示)呢?

举个例子:

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

另外,你也可以通过将索引操作串联起来,使用 xy

>>> A[x][:,y]
array([[ 2,  4,  5],
       [12, 14, 15]])

首先,x 用来选择 A 的行。接着,[:,y] 会根据 y 中的元素来选取子数组的列。

在这种情况下,操作是对称的:如果你愿意,也可以先选择列,使用 A[:,y][x]

撰写回答