ndarray的数据存储为1d缓冲区 – 只是一块内存.数组的多维特性由shape和strides属性以及使用它们的代码生成.
numpy开发人员选择允许任意数量的维度,因此形状和步幅表示为任何长度的元组,包括0和1.
相比之下,MATLAB是围绕为矩阵运算开发的FORTRAN程序构建的.在早期,MATLAB中的所有东西都是2d矩阵.在2000年左右(v3.5),它被推广到允许超过2d,但从不少. numpy np.matrix仍然遵循旧的2d MATLAB约束.
如果您来自MATLAB世界,您习惯于这两个维度,以及行向量和列向量之间的区别.但是在不受MATLAB影响的数学和物理学中,矢量是一维数组. Python列表本质上是1d,c数组也是如此.要获得2d,您必须拥有列表或数组指针数组,并使用x [1] [2]样式的索引.
看看这个数组及其变体的形状和步幅:
In [48]: x=np.arange(10)
In [49]: x.shape
Out[49]: (10,)
In [50]: x.strides
Out[50]: (4,)
In [51]: x1=x.reshape(10,1)
In [52]: x1.shape
Out[52]: (10, 1)
In [53]: x1.strides
Out[53]: (4, 4)
In [54]: x2=np.concatenate((x1,x1),axis=1)
In [55]: x2.shape
Out[55]: (10, 2)
In [56]: x2.strides
Out[56]: (8, 4)
MATLAB最后增加了新的尺寸.它将其值排序为order =’F’数组,并且可以很容易地将(n,1)矩阵更改为(n,1,1,1). numpy是默认顺序=’C’,并且可以在开始时轻松扩展数组维度.在利用广播时,了解这一点至关重要.
因此x1 x是a(10,1)(10,)=> (10,1)(1,10)=> (10,10)
由于广播,(n,)数组更像是(1,n),而不是(n,1). 1d数组更像是行矩阵而不是第1列.
In [64]: np.matrix(x)
Out[64]: matrix([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
In [65]: _.shape
Out[65]: (1, 10)
连接点是需要匹配的维度.它不使用广播来调整尺寸.有一堆堆栈函数可以简化这种约束,但是它们通过在使用连接之前调整尺寸来实现.看看他们的代码(可读的Python).
因此,熟练的numpy用户需要熟悉该通用形状元组,包括empty()(0d数组),(n,)1d和up.对于更高级的东西,了解步幅也有帮助(例如在转置的步幅和形状上查看).