将一维numpy.array作为矩阵索引

7 投票
2 回答
7662 浏览
提问于 2025-04-16 10:07

我正在尝试在运行时对一个 numpy.array 进行索引,这个数组的维度可能会变化。比如,如果我想获取一个 n*m 数组 a 的第一行,可以简单地这样做:

a[0,:]

但是,如果 a 恰好是一个 1xn 的向量,那么上面的代码就会报错,提示:

IndexError: too many indices

因为我希望代码能够尽可能高效地执行,所以不想引入 if 语句。有没有人有一个方便的解决方案,最好是不需要改变任何数据结构的类型?

2 个回答

1

'数组'还是'矩阵'? 我该用哪个?这一部分,来自Numpy for Matlab Users的维基页面:

对于数组,形状为1xN、Nx1和N的向量都是不同的东西。像A[:,1]这样的操作会返回一个形状为N的1维数组,而不是形状为Nx1的2维数组。对一个1维数组进行转置是没有任何效果的。

这里有个例子,说明它们并不相同:

>>> import numpy as np
>>> a1 = np.array([1,2,3])
>>> a1
array([1, 2, 3])
>>> a2 = np.array([[1,2,3]])    // Notice the two sets of brackets
>>> a2
array([[1, 2, 3]])
>>> a3 = np.array([[1],[2],[3]])
>>> a3
array([[1],
       [2],
       [3]])

那么,你确定你的所有数组都是2维数组吗,还是有一些是1维数组呢?

如果你想使用命令array[0,:],我建议你实际上使用1xN的2维数组,而不是1维数组。这里有个例子:

>>> a2 = np.array([[1,2,3]])    // Notice the two sets of brackets
>>> a2
array([[1, 2, 3]])
>>> a2[0,:]
array([1, 2, 3])
>>> b2 = np.array([[1,2,3],[4,5,6]])
>>> b2
array([[1, 2, 3],
       [4, 5, 6]])
>>> b2[0,:]
array([1, 2, 3])
9

只需要用 a[0] 来代替 a[0,:]。这样做会返回矩阵的第一行,或者返回向量的第一个元素。这样是你想要的吗?

如果你想在一维情况下获取整个向量,可以使用 numpy.atleast_2d(a)[0]。这样不会复制你的向量,而只是把它当作一个二维的 1 x n 数组来访问。

撰写回答