为什么Numpy有时会省略数组的维度

时间:2016-02-11 03:30:00

标签: python arrays numpy

我是Python的初学者。我曾经密集地使用matlab。现在我转向python。我对数组的维度有疑问。

我导入Numpy

我首先创建一个数组X,然后我使用一些嵌入式函数,比如sum,来玩我的数组。最后,当我尝试检查数组X的维度时,它变为:X.shape,outputs(81,)。数字81是我的预期,但我也期望第二维度是1,而不是仅仅省略。这让我感到非常不舒服,即使我直接输入X,它输出正确,即一列和X中的数字都是预期的。

然后,当我使用另一个数组Y,字面上有Y.shape时,输出(81,1),那么如果我输入X * Y,我希望看到一个维数(81,1),但相反,我看到了一个维度阵列(81,81)。

我不知道产生这种结果的潜在机制是什么。

我解决这个问题的方式非常愚蠢。我首先创建一个新的数组C =零((81,1)),所以C字面上有维度(81,1),然后我通过键入C [:,0] = X然后C.shape将我的X分配给C =(81,1)。请注意,如果我键入C = X,那么C.shape =(81,),这可以回到我的问题。所以我可以解决我的问题,但我确信有更好的方法来解决我的问题,我也不明白为什么python会产生类似(81,)的东西,省略第二维。

3 个答案:

答案 0 :(得分:3)

Numpy 省略数组的维度。它是为多维数组(不仅仅是1d或2d数组)构建的库,因此它在不同维度的数组之间做出了非常清晰的区分(它不能假设任何数组只是更高维数组的简并形式,因为数字从概念上讲,维度是无限的。

  • 维度为(81, 1)的数组是 2d 数组,第二维的等于1.

  • 尺寸为(81, )的数组只是 1d 数组。

当你写C[:,0]时,你指的是一个专栏。因此

  • 如果你写C[: 0] = X,你要为C的一列(恰好是唯一的一列)分配一列,因此不是更改C

  • 的维度
  • 如果你写C = X,那么你说C现在也是一个列,因此正在改变 {{1}的维度}。

答案 1 :(得分:1)

MATLAB和numpy之间的根本区别在于,在MATLAB中,矩阵至少有2个维度。回到v3.0,它只有2个numpy数组可以有0,1,2或更多维度。

C.shape返回维度的元组;它可以是0长度,(),1值,(81,)或2 (81,1)c.ndim只是len(C.shape)

numpy有一个matrix子类,其行为类似于只有2维的旧MATLAB矩阵。对于一些MATLAB程序员来说,它更容易使用,但在其他方面的用途有限。

np.sum(C)等操作会减少维度数量(除非使用keepdims参数)。

你的行动:

# X.shape == (81,)
C = zeros((81,1))
# C.shape == (81,1)
C[:,0] = X    # no change in shape
# X has 81 elements, C[:,0] does too - so the assignment works

C = X  # reassign the variable

C=X对原始C不执行任何操作。你也可以写Foobar = X

要使X具有2个维度,请修改其形状 - 有多种方式(使用MATLAB并行)

 X = np.reshape(X, (81,1))
 X.shape = (81,1)
 X = X[:,None]

广播的工作原理是扩展尺寸,如下所示:

(81,1)*(81,) => 
(81,1)*(1,81) => 
(81,81)*(81,81) => 
(81,81). 

请注意,numpy会根据需要自动添加维度 - MATLAB会做同样的事情,但最后会这样做。

答案 2 :(得分:0)

查看此帖子:" Difference between numpy.array shape (R, 1) and (R,)"

特别是Gareth Rees的答案。