我是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,)的东西,省略第二维。
答案 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的答案。