Python numpy的转置方法无法将1D行数据数组转换为列数据数组 让我们考虑一个一维行/水平数组: 将numpy作为np导入 N=10 a=np.arangeN数组[0,1,2,3,4,5,6,7,8,9] a、 形状10,

Python numpy的转置方法无法将1D行数据数组转换为列数据数组 让我们考虑一个一维行/水平数组: 将numpy作为np导入 N=10 a=np.arangeN数组[0,1,2,3,4,5,6,7,8,9] a、 形状10,,python,arrays,numpy,transpose,numpy-ndarray,Python,Arrays,Numpy,Transpose,Numpy Ndarray,现在我想让b a 1D列/垂直数组转置为a: b=a.转置数组[0,1,2,3,4,5,6,7,8,9] b、 形状10, 但是.transpose方法返回一个形状完全相同的数据数组 我期望看到的是 np.数组[[0]、[1]、[2]、[3]、[4]、[5]、[6]、[7]、[8]、[9]] 这可以通过以下方式实现: c=a.a.形状[0],1或c=a;c、 形状=c。形状[0],1 c、 形状10,1 令我惊讶的是,它的形状是10,1而不是1,10 在倍频程/Scilab中,我可以做到: N=

现在我想让b a 1D列/垂直数组转置为a:

b=a.转置数组[0,1,2,3,4,5,6,7,8,9] b、 形状10, 但是.transpose方法返回一个形状完全相同的数据数组

我期望看到的是

np.数组[[0]、[1]、[2]、[3]、[4]、[5]、[6]、[7]、[8]、[9]] 这可以通过以下方式实现:

c=a.a.形状[0],1或c=a;c、 形状=c。形状[0],1 c、 形状10,1 令我惊讶的是,它的形状是10,1而不是1,10

在倍频程/Scilab中,我可以做到:

N=10 b=0:N-1 a=b' 大小b%ans=1 10 大小a%ans=10 1 我知道numpy ndarray并不像前面讨论的那样是矩阵,但是numpy的转置函数的行为对我来说毫无意义!如果您能帮助我理解这种行为的意义,以及我在这里遗漏了什么,我将不胜感激


另外,到目前为止我所理解的是b=a,转置是b=a的等价物;b、 shape=b.shape[::-1],如果你有一个N的二维数组,1将返回一个1,N形数组,正如你从转置操作符中所期望的那样。然而,numpy似乎将N的1D数组视为0D标量。我认为他们应该将这个方法命名为其他名称,因为这会误导/混淆IMHO。

正如您已经提到的numpy数组不是矩阵。转置函数的定义如下

排列数组的维度

这意味着numpy的转置方法将数据从一个维度移动到另一个维度。由于1D数组只有一个维度,因此没有其他维度可以移动数据t0。因此,在转置产生任何效果之前,您需要添加一个维度。这种行为与高维阵列3D、4D…一致也是有意义的。。。数组

有一个干净的方法来实现你想要的

N=10 a=np.arangeN a[:,np.newaxis]
正如您已经提到的,numpy数组不是矩阵。转置函数的定义如下

排列数组的维度

这意味着numpy的转置方法将数据从一个维度移动到另一个维度。由于1D数组只有一个维度,因此没有其他维度可以移动数据t0。因此,在转置产生任何效果之前,您需要添加一个维度。这种行为与高维阵列3D、4D…一致也是有意义的。。。数组

有一个干净的方法来实现你想要的

N=10 a=np.arangeN a[:,np.newaxis]
为了更好地理解numpy阵列,您应该看看这篇综述文章:

简而言之,numpy ndarray有一个称为步长的属性,即

要在内存中跳过以继续下一个元素的字节数。 例如,对于10,10字节数组,跨距可以是10, 1,换句话说:继续一个字节进入下一列,然后继续十个字节 字节来定位下一行

对于ndarray a,a.stride=8,,它表明它仅为一维,并且要进入这个一维上的下一个元素,需要在内存中提前8个字节,每个int为64位

步幅对于表示转置非常有用:

例如,通过修改步幅,可以对数组进行转置或调整 以零成本重塑无需复制内存


所以如果有一个二维数组,比如说b=np.ones3,5,那么b.strips=40,8,而b.transpose.strips=8,40。因此,正如您所看到的,转置的2D ndarray只是完全相同的数组,其步长已被重新排序。由于一维数组只有一维,因此交换步长值(即转置)没有任何作用。

要更好地理解numpy数组,您应该看一下这篇综述文章:

简而言之,numpy ndarray有一个称为步长的属性,即

要在内存中跳过以继续下一个元素的字节数。 例如,对于10,10字节数组,跨距可以是10, 1,换句话说:继续一个字节进入下一列,然后继续十个字节 字节来定位下一行

对于ndarray a,a.stride=8,,它表明它仅为一维,并且要进入这个一维上的下一个元素,需要在内存中提前8个字节,每个int为64位

步幅对于表示转置非常有用:

例如,通过修改步幅,可以对数组进行转置或调整 以零成本重塑无需复制内存

所以如果有一个二维数组,比如说b=np.ones3,5,那么b.strips=40,8,而b.transpose.strips=8,40。因此,正如您所看到的,转置的2D ndarray只是完全相同的数组,其步长已被重新排序。由于1D ndarray只有一个维度,因此交换其步长值,即
它的转置不起任何作用。

感谢您提供的干净方法。但对我来说还是没有意义。numpy似乎将1D数组视为0D标量。我已经编辑了答案,希望对clean方法有意义。但对我来说还是没有意义。似乎numpy将1D数组视为0D标量。我已经编辑了答案,希望有意义。你没有认真对待10,形状和1,10之间的差异@你说得对。所以numpy将10视为1D,而将其视为0D标量。威德!np.array1是0d数组,np.array[1,2,3]是1d数组。数组[[1,2,3]]是二维的。数一数[]。Octave/MATLAB有一个2d的人工下限。@hpaulj我想我现在明白了numpy的转置仅仅是ndarray对象的形状元组属性的逆。和数学矩阵转置无关,比如我们在倍频程中看到的。但我仍然不同意这种行为是可以的。N,数组不是标量,只有标量或对称矩阵应该具有相同的转置IMHO。但一维numpy数组不是矩阵。它也不是一个行向量。numpy定义了转置来处理任何维度数组,0、1甚至3。在倍频程中,如果sizeb为2,3,4,则b'会引发错误。你所使用的“数学矩阵转置”仅适用于矩阵、2d数组。你没有认真对待10、形状和1、10之间的差异@你说得对。所以numpy将10视为1D,而将其视为0D标量。威德!np.array1是0d数组,np.array[1,2,3]是1d数组。数组[[1,2,3]]是二维的。数一数[]。Octave/MATLAB有一个2d的人工下限。@hpaulj我想我现在明白了numpy的转置仅仅是ndarray对象的形状元组属性的逆。和数学矩阵转置无关,比如我们在倍频程中看到的。但我仍然不同意这种行为是可以的。N,数组不是标量,只有标量或对称矩阵应该具有相同的转置IMHO。但一维numpy数组不是矩阵。它也不是一个行向量。numpy定义了转置来处理任何维度数组,0、1甚至3。在倍频程中,如果sizeb为2,3,4,则b'会引发错误。您使用的“数学矩阵转置”仅为矩阵、二维数组定义。