转置一个1D NumPy数组

我使用Python和NumPy,在“转置”方面有一些问题:

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

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

510496 次浏览

它的工作原理和预期的完全一样。1 d数组的转置仍然是1 d数组!(如果你习惯了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会在进行各种计算时自动广播一个1D数组。通常不需要区分行向量和列向量(它们都不是向量。它们都是2D的!)当你只想要一个向量时。

使用两个括号对,而不是一个。这将创建一个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)

你可以把一个现有的向量转换成一个矩阵,方法是用一组额外的方括号把它括起来。

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

—>列/行矩阵:

>>> 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所说,为了可读性,你可以用np.newaxis替换None

你只能对2D数组进行转置。你可以使用numpy.matrix来创建一个2D数组。这迟了三年,但我只是在可能的解决方案中添加了一些:

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

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

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

对于一维阵列:

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

numpy中的函数名是column_stack

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

另一个解决方案…: -)

import numpy as np


a = [1,2,4]

[1,2,4]

b = np.array([a]).T
< p >阵列([[1], [2], [4]]) < / p >

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

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

它也适用于香草列表:

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

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

我只是巩固上面的帖子,希望它能帮助别人节省一些时间:

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

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

有两种方法来转置一个1-D数组:


用“np。或者没有。< / em >

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。矩阵,意味着增加一个新的维度。< / em >

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

有一个方法没有在答案中描述,但在文档中描述了numpy.ndarray.transpose方法:

对于一维数组,这没有影响,因为转置向量就是相同的向量。要将1-D数组转换为2D列向量,必须添加一个额外维度。np.atleast2d (a)。T实现了这一点,就像a[:, np.newaxis]一样。

你可以这样做:

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

这(在我看来)比使用newaxis更好。

基本上转置函数的作用是交换数组的形状和步长:

>>> 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数组(rank-1数组)的情况下,形状和跨距是1元素元组,不能交换,这样的一维数组的转置返回它不变。相反,你可以将“行向量”(形状为(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]])

当然你不必这样做,因为你有一个一维数组,你可以直接通过a.reshape((-1, 1))a[:, None]将它重塑为(n, 1)数组。我只是想演示一下如何对数组进行转置。

要像你的例子中那样转置一个一维数组(平面数组),你可以使用np.expand_dims()函数:

>>> a = np.expand_dims(np.array([5, 4]), axis=1)
array([[5],
[4]])

np.expand_dims()将为所选轴添加一个维度。在本例中,我们使用axis=1,它增加了一个列维度,有效地调换了原始平面数组。