转置NumPy数组

tha*_*ing 166 python transpose numpy

我使用Python和NumPy并且在"转置"方面存在一些问题:

import numpy as np
a = np.array([5,4])
print(a)
print(a.T)
Run Code Online (Sandbox Code Playgroud)

调用a.T不是转置数组.如果a是例如[[],[]]然后它正确转置,但我需要转置[...,...,...].

Joe*_*ton 217

它完全按照预期的方式工作.一阵列的转置仍然是一维阵列!(如果您习惯使用matlab,它基本上没有一维数组的概念.Matlab的"1D"数组是2D.)

如果你想将你的1D矢量转换为2D数组然后转置它,只需将其切片np.newaxis(或者None,它们是相同的,newaxis只是更具可读性).

import numpy as np
a = np.array([5,4])[np.newaxis]
print(a)
print(a.T)
Run Code Online (Sandbox Code Playgroud)

一般来说,你不需要担心这一点.如果您只是出于习惯,添加额外维度通常不是您想要的.在进行各种计算时,Numpy会自动广播一维数组.当你只想要一个向量时,通常不需要区分行向量和列向量(它们都不是向量.它们都是2D!).

  • 不仅仅是matlab,线性代数也有行/列向量的概念。Numpy 对来自很多地方的人来说是特殊的,而不仅仅是 matlab。 (10认同)
  • @JoeKington有一种情况,广播一维数组是有用的.计算阵列中所有1D点之间的距离.感谢你的解决方案,你可以做x - x [np.newaxis] .T,它给出了距离矩阵 (6认同)
  • 就个人而言,我发现`np.vstack()`操作更明确:`print np.vstack(a)`. (3认同)
  • @thaking - 我只是使用`np.arange`快速制作一维数组.对于`a = np.array([5,4])`它的作用完全相同. (2认同)
  • @thaking如果你是numpy的新手 - 请记住圆括号`()`并不表示numpy中的额外维度.如果`a = np.arange(10)`那么`a`是`数组([0,1,2,3,4,5,6,7,8,9])`由`a .__ repr __产生的`( )`.这是一个1维(即`a.ndim - > 1`)向量,如方括号`[]`所示.当你执行`print(a)`或`a .__ str __()`时,看不到`array(...)`. (2认同)

sav*_*ent 122

使用两个支架对而不是一个.这会创建一个可以转置的2D数组,与您创建的1D数组不同,如果使用一个支架对.

import numpy as np    
a = np.array([[5, 4]])
a.T
Run Code Online (Sandbox Code Playgroud)

更全面的例子:

>>> a = [3,6,9]
>>> b = np.array(a)
>>> b.T
array([3, 6, 9])         #Here it didn't transpose because 'a' is 1 dimensional
>>> b = np.array([a])
>>> b.T
array([[3],              #Here it did transpose because a is 2 dimensional
       [6],
       [9]])
Run Code Online (Sandbox Code Playgroud)

使用numpy的shape方法来查看这里发生了什么:

>>> b = np.array([10,20,30])
>>> b.shape
(3,)
>>> b = np.array([[10,20,30]])
>>> b.shape
(1, 3)
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个解决方案[np.newaxis],它看起来更优雅imo. (9认同)

Ulf*_*lak 70

对于1D阵列:

a = np.array([1, 2, 3, 4])
a = a.reshape((-1, 1)) # <--- THIS IS IT

print a
array([[1],
       [2],
       [3],
       [4]])
Run Code Online (Sandbox Code Playgroud)

一旦你理解-1这里意味着"尽可能多的行",我发现这是"转置"数组最可读的方式.如果您的数组具有更高的维度,只需使用a.T.

  • 请注意,这仅适用于矢量.如果你有二维数组,操作`transpose`和`reshape`以不同的方式修改数组(结果图像形状是相同的,但元素的放置方式不同). (5认同)
  • 谢谢你的评论.我明白了你的观点,但我认为它分散了我的答案,因为我确实给出了@thaking帧的确切问题的一个简单的单行解决方案.它不是关于2-d阵列,而是关于1-d阵列.苹果和梨在这里. (2认同)
  • 当然.对于这种情况,你的答案是正确和优雅的,我从来没有打算批评它.但是考虑到问题标题("Transposing a NumPy array"),我怀疑很多访问者会来这里寻找更通用的解决方案,我想警告他们它不适用于2D阵列.否则,根据OP的问题,您的答案是正确和合适的. (2认同)

nob*_*bar 17

您可以将现有矢量包装到一个额外的方括号中,将其转换为矩阵...

from numpy import *
v=array([5,4]) ## create a numpy vector
array([v]).T ## transpose a vector into a matrix
Run Code Online (Sandbox Code Playgroud)

numpy也有一个matrix类(参见数组与矩阵)...

matrix(v).T ## transpose a vector into a matrix
Run Code Online (Sandbox Code Playgroud)

  • 矩阵类很快就会被弃用,对吧? (2认同)

ank*_*tis 13

numpy 1D数组 - >列/行矩阵:

>>> a=np.array([1,2,4])
>>> a[:, None]    # col
array([[1],
       [2],
       [4]])
>>> a[None, :]    # row, or faster `a[None]`
array([[1, 2, 4]])
Run Code Online (Sandbox Code Playgroud)

正如@乔金通说,你可以替换None使用np.newaxis的可读性.


Col*_*nic 9

要将1d数组'转置'到2d列,您可以使用numpy.vstack:

>>> numpy.vstack(numpy.array([1,2,3]))
array([[1],
       [2],
       [3]])
Run Code Online (Sandbox Code Playgroud)

它也适用于香草列表:

>>> numpy.vstack([1,2,3])
array([[1],
       [2],
       [3]])
Run Code Online (Sandbox Code Playgroud)


Moh*_*ney 5

而是用来arr[:,None]创建列向量