如果有混淆,(3,) 并不意味着缺少维度。逗号是单个元素元组的标准 Python 表示法的一部分。 (1,3), (3,), and (3,1) 的形状不同,
虽然它们可以包含相同的 3 个元素,但它们在计算中的用途 (broadcasting) 不同,它们的打印格式不同,它们的等效列表也不同:
In [21]: np.array([1,2,3])
Out[21]: array([1, 2, 3])
In [22]: np.array([1,2,3]).tolist()
Out[22]: [1, 2, 3]
In [23]: np.array([1,2,3]).reshape(1,3).tolist()
Out[23]: [[1, 2, 3]]
In [24]: np.array([1,2,3]).reshape(3,1).tolist()
Out[24]: [[1], [2], [3]]
而且我们不必只添加一个单一维度:
In [25]: np.array([1,2,3]).reshape(1,3,1).tolist()
Out[25]: [[[1], [2], [3]]]
In [26]: np.array([1,2,3]).reshape(1,3,1,1).tolist()
Out[26]: [[[[1]], [[2]], [[3]]]]
在numpy 中,数组可以有 0、1、2 或更多维度。 1 维和 2 维一样合乎逻辑。
在 MATLAB 中,矩阵总是有 2 个暗淡(或更多),但不一定非要如此。严格来说,MATLAB 甚至没有标量。只有以 MATLAB 为标准,形状为 (3,) 的数组才缺少维度。
numpy 是基于 Python 构建的,它作为标量和列表(可以嵌套)。 Python 列表有多少维?
如果您想了解历史,MATLAB 是作为一组 Fortran 线性代数例程的前端而开发的。考虑到这些问题,这些例程解决了二维矩阵的概念,并且行与列向量是有意义的。直到第 3 版,MATLAB 才被推广到允许超过 2 维(在 1990 年代后期)。
numpy 基于向 Python 提供数组的多次尝试(例如 numeric)。这些开发人员对数组采用了更通用的方法,其中 2d 是一种人为约束。这在计算机语言和数学(和物理)中具有优先权。 APL 是在 1960 年代开发的,最初是作为一种数学符号,然后是一种计算机语言。就像numpy 一样,它的arrays 可以是0d 或更高。 (因为我在使用 MATLAB 之前使用了 APL,所以numpy 的方法感觉很自然。)
在APL 中没有单独的列表或元组。所以array、rho A的形状本身就是一个数组,rho rho A是A的维数,也叫rank。
http://docs.dyalog.com/14.0/Dyalog%20APL%20Idioms.pdf