转置NumPy数组

时间:2011-05-10 18:24:30

标签: python numpy transpose

我使用Python和NumPy并且在“转置”方面遇到了一些问题:

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

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

16 个答案:

答案 0 :(得分:198)

它完全按照预期工作。 1D 数组的转置仍然是 1D 数组! (如果你已经习惯了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)

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

答案 1 :(得分:111)

使用两个支架对而不是一个。如果使用一个括号对,这会创建一个可以转置的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)

答案 2 :(得分:63)

对于1D数组

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

答案 3 :(得分:16)

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

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

numpy也有一个matrix课程(见array vs. matrix)......

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

答案 4 :(得分:13)

numpy 1D数组 - &gt;列/行矩阵:

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

正如@ joe-kington所说,为了便于阅读,您可以将None替换为np.newaxis

答案 5 :(得分:9)

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

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

它也适用于香草列表:

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

答案 6 :(得分:3)

您只能转置2D数组。您可以使用numpy.matrix创建2D数组。这已经晚了三年,但我只想补充一套可能的解决方案:

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

答案 7 :(得分:1)

的转置
x = [[0 1],
     [2 3]]

xT = [[0 2],
      [1 3]]

代码是:

x = array([[0, 1],[2, 3]]);
np.transpose(x)        

这是一个链接以获取更多信息:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html

答案 8 :(得分:1)

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

import numpy as np

a = [1,2,4]
  

[1,2,4]

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

阵列([[1],          [2],          [4]])

答案 9 :(得分: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)

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

numpy中的函数名称为column_stack

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

答案 12 :(得分:0)

代替使用arr [:,None]创建列向量

答案 13 :(得分:0)

有一种方法未在答案中描述,但在documentation中针对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更好。

答案 14 :(得分: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)

如果是1D numpy数组(rank-1数组),则形状和步幅为1元素元组,并且不能交换,并且此类1D数组的转置将使其保持不变。相反,您可以将“行向量”(形状为(1, n)的numpy数组)转置为“列向量”(形状为(n, 1)的numpy数组)。为此,您必须先将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]数组。我只是想演示转置数组的工作原理。

答案 15 :(得分: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 的数组。