转置NumPy数组


191

我使用Python和NumPy,“移调”有一些问题:

import numpy as np
a = np.array([5,4])
print(a)
print(a.T)

调用a.T不转置数组。a例如,如果为,[[],[]]则它正确转置,但我需要的转置[...,...,...]


也尝试过“ print a.transpose”,它是相同的,但是没有成功,所以不能转置...
解冻

Answers:


245

它的工作完全符合预期。一数组的转置仍然是一维数组!(如果您习惯使用Matlab,从根本上讲就没有1D数组的概念。Matlab的“ 1D”数组是2D。)

如果要将一维矢量转换为二维数组然后转置,只需将其切成薄片np.newaxis(或者None,它们是相同的,newaxis可读性更强)。

import numpy as np
a = np.array([5,4])[np.newaxis]
print(a)
print(a.T)

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


2
@thaking-我只是用来np.arange快速制作一维数组。的工作原理完全相同a = np.array([5,4])
乔·肯顿

2
@thaking如果您不熟悉numpy,请记住,圆括号()并不表示numpy中的附加尺寸。如果a = np.arange(10)然后aarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])作为由产生a.__repr__()a.ndim --> 1如方括号所示,这是一维(即)向量[]。在array( ... )当你要么是没见过print(a)a.__str__()
dtlussier 2012年

7
@JoeKington存在一种情况,广播一维数组很有用。计算数组中所有一维点之间的距离。多亏了您的解决方案,您可以执行x-x [np.newaxis] .T从而得出距离矩阵
JuanPi 2013年

4
就个人而言,我觉得np.vstack()操作更加明确:print np.vstack(a)
亚历山大·波兹涅夫

2
它不仅是matlab,而且线性代数具有行/列向量的概念。Numpy对于来自很多地方的人是特质,而不仅仅是Matlab。
eric '18

133

使用两对括号而不是一对。这将创建一个可以转置的2D数组,这与使用一对括号时创建的1D数组不同。

import numpy as np    
a = np.array([[5, 4]])
a.T

更详尽的示例:

>>> 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]])

使用numpy的shape方法查看此处发生的情况:

>>> b = np.array([10,20,30])
>>> b.shape
(3,)
>>> b = np.array([[10,20,30]])
>>> b.shape
(1, 3)

11
与[np.newaxis]相比,我更喜欢这种解决方案,它看起来更优雅。
PhilMacKay 2014年

机器不是那么聪明。即使您只有一个妻子,也应将其声明为您的第一任妻子。
Sreeragh AR

这应该是选择的答案
bruno

79

对于一维数组

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

print a
array([[1],
       [2],
       [3],
       [4]])

一旦您了解到-1表示“需要的行数”,我就会发现这是“转置”数组最易读的方式。如果您的数组具有更高的维数,则只需使用a.T


5
请注意,这仅适用于向量。如果您具有二维数组,则操作transposereshape修改数组的方式将有所不同(生成的图像形状相同,但是元素放置的位置不同)。
johndodo

2
感谢您的发言。我明白您的意思,但我认为它分散了我的注意力,不仅仅使我分心,因为我确实为@thaking框架的确切问题提供了简单的单线解决方案。它不是关于二维数组,而是关于一维数组。这里的苹果和梨。
Ulf Aslak

2
当然。对于这种情况,您的回答是正确而优雅的,我绝不想批评它。但是考虑到问题的标题(“转置NumPy数组”),我怀疑许多访问者会来这里寻求更通用的解决方案,并且我想警告他们说它不适用于2D数组。否则,鉴于操作员的问题,您的答案是正确且合适的。
约翰多多

@UlfAslak,请更新您的答案,即您的方法不能推广到ND数组,按照!johndodo的建议进行清理总是很有益的,这样就不会有人错误地使用您的技术了!!,这里的问题是正确的答案而不是班轮!!
Anu

18

您可以通过将现有矢量包装在一组额外的方括号中来将其转换为矩阵...

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

numpy也有一个matrix类(请参阅数组与矩阵)。

matrix(v).T ## transpose a vector into a matrix

14

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]])

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


10

要将1d数组“转置”为2d列,可以使用numpy.vstack

>>> numpy.vstack(numpy.array([1,2,3]))
array([[1],
       [2],
       [3]])

它也适用于普通列表:

>>> numpy.vstack([1,2,3])
array([[1],
       [2],
       [3]])

1
@sandroscodelller,您是否看过底层代码vstacknp.concatenate([atleast_2d(_m) for _m in tup], 0)。它将数组拆分为(1,1)数组,并将它们连接起来!在此过程中,它会进行复制,而所有重塑后的视图都会进行复制。
hpaulj

3

您只能转置2D阵列。您可以numpy.matrix用来创建2D阵列。这已经晚了三年,但我只是添加了可能的解决方案集:

import numpy as np
m = np.matrix([2, 3])
m.T

np.matrix不需要使用,通常不建议使用。
hpaulj



2

另一种解决方案.... :-)

import numpy as np

a = [1,2,4]

[1、2、4]

b = np.array([a]).T

数组([[1],[2],[4]])


此解决方案有什么问题?
omotto

1

我只是合并以上帖子,希望它可以帮助其他人节省一些时间:

下面的数组具有(2, )维,它是一维数组,

b_new = np.array([2j, 3j])  

有两种方式转置一维数组:


用“ np.newaxis”切片或不切片。

print(b_new[np.newaxis].T.shape)
print(b_new[None].T.shape)

其他写法,上面没有T操作。

print(b_new[:, np.newaxis].shape)
print(b_new[:, None].shape)

包装[]或使用np.matrix意味着添加新尺寸。

print(np.array([b_new]).T.shape)
print(np.matrix(b_new).T.shape)

0

正如上面提到的一些评论,一维数组的转置是一维数组,因此转置一维数组的一种方法是将数组转换为矩阵,如下所示:

np.transpose(a.reshape(len(a), 1))

0

中的函数名称numpycolumn_stack

>>>a=np.array([5,4])
>>>np.column_stack(a)
array([[5, 4]])

0

有一种方法未在答案中描述,但在该方法的文档中进行了描述numpy.ndarray.transpose

对于一维数组,这没有任何作用,因为转置向量只是同一向量。要将一维数组转换为二维列向量,必须添加一个附加维。np.atleast2d(a).T实现了这一点,a [:, np.newaxis]也是如此。

一个可以做:

import numpy as np
a = np.array([5,4])
print(a)
print(np.atleast_2d(a).T)

哪个(imo)比使用更好newaxis


0

基本上,transpose函数的作用是交换数组的形状和步幅:

>>> a = np.ones((1,2,3))

>>> a.shape
(1, 2, 3)

>>> a.T.shape
(3, 2, 1)

>>> a.strides
(48, 24, 8)

>>> a.T.strides
(8, 24, 48)

如果是一维numpy数组(秩为1的数组),则形状和步幅为1元素元组,并且不能交换,而此类一维数组的转置将使其保持不变。相反,您可以将“行向量”(shape的numpy数组(1, n))转置为“列向量”(shape的numpy数组(n, 1))。为此,您必须先将1D numpy数组转换为行向量,然后交换形状并进行跨步(转置)。下面是执行此操作的函数:

from numpy.lib.stride_tricks import as_strided

def transpose(a):
    a = np.atleast_2d(a)
    return as_strided(a, shape=a.shape[::-1], strides=a.strides[::-1])

例:

>>> a = np.arange(3)
>>> a
array([0, 1, 2])

>>> transpose(a)
array([[0],
       [1],
       [2]])

>>> a = np.arange(1, 7).reshape(2,3)
>>> a     
array([[1, 2, 3],
       [4, 5, 6]])

>>> transpose(a)
array([[1, 4],
       [2, 5],
       [3, 6]])

当然,您不必这样做,因为您拥有一维数组,您可以(n, 1)通过a.reshape((-1, 1))或直接将其整形为数组a[:, None]。我只是想演示如何转置数组。


0

到目前为止,我学会了以紧凑且可读的方式对一维数组进行实现的方法:

h = np.array([1,2,3,4,5])

v1 = np.vstack(h)
v2 = np.c_[h]

h1 = np.hstack(v1)
h2 = np.r_[v2[:,0]]

numpy.r_ numpy.c_分别将切片对象转换为沿第一和第二轴的串联。因此,切片v2 [:,0]将垂直数组v2换回水平数组h2

numpy.vstack等效于形状(N,)的一维数组已重整为(1,N)后沿第一轴的连接。重建除以 vsplit的数组。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.