在numpy中使用1d向量和2d向量的性能/标准差比较

5
有没有在NumPy中将向量表示为1d或2d ndarrays的标准做法?我从MATLAB转过来,MATLAB将向量表示为2d数组。
2个回答

4
根据我的经验,对于向量来说,numpy中1D是常见的。将包含n个元素的向量保留为形状为(1,n)或(n,1)的2D数组的唯一好处是在线性代数上下文中,您想要区分行向量和列向量。正如EitanT在他现已删除的答案中所暗示的那样,您可能希望使用numpy的"matrix"类型,它保留了返回的2D形状,除了单个元素访问,例如如果"a"的形状为(m,n),则对于类型为"ndarray"的"a[0]"具有形状"(n,)",但对于类型为"matrix"的"a[0]"具有形状"(1,n)",尽管"a[0,0]"在两种情况下都返回标量。
如果您坚持使用形状为(n,)的1D向量,则可以根据需要即时重塑为形状为2D的向量进行特定操作。
a.reshape(-1, 1) # shape (n, 1)
a[:, None] # shape (n, 1)
a.reshape(1, -1) # shape (1, n)
a[None, :] # shape (1, n)

Numpy将自动调整您的一维向量形状为(1, n),当它与涉及到2D数组的操作进行广播时。请参考广播文档

1
感谢您澄清了这些差异。我的主要关注点是可能出现糟糕的矩阵乘法而不报错。http://www.scipy.org/NumPy_for_Matlab_Users#head-e9a492daa18afcd86e84e07cd2824a9b1b651935 显示矩阵类型有一些缺点,这些缺点超过了重载“*”运算符的好处。 - bluecat

1
在Matlab中(出于历史原因,我会这样认为),基本类型是一个M×N数组(矩阵),因此标量是1×1数组,向量可以是N×1或1×N数组。(内存布局始终为Fortran风格)。
在NumPy中不存在这种“限制”:您有真正的标量,ndarray可以具有任意多个维度。(内存布局可以是C或Fortran连续的。)因此,没有首选(标准)做法。根据您的应用程序,选择最适合您需求的那个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接