繁体   English   中英

转置一维 NumPy 数组

[英]Transposing a 1D NumPy array

我使用 Python 和 NumPy 并且“转置”有一些问题:

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

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

它完全按照预期工作。 数组的转置仍然是一维数组! (如果你习惯使用 matlab,它基本上没有一维数组的概念。Matlab 的“一维”数组是二维的。)

如果你想把你的一维向量变成一个二维数组然后转置它,只需用np.newaxis切片(或None ,它们是一样的, newaxis只是更具可读性)。

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

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

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

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)

对于一维数组

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

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

一旦你明白 -1 在这里的意思是“根据需要尽可能多的行”,我发现这是“转置”数组的最易读的方式。 如果您的数组具有更高的维度,只需使用aT

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

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

numpy 一维数组 --> 列/行矩阵:

>>> 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以提高可读性。

要将一numpy.vstack数组“转置”为二维列,您可以使用numpy.vstack

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

它也适用于香草列表:

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

您只能转置二维数组。 您可以使用numpy.matrix创建一个二维数组。 这已经晚了三年,但我只是增加了可能的解决方案集:

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

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

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

import numpy as np

a = [1,2,4]

[1, 2, 4]

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

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

基本上,转置函数所做的是交换数组的形状和步幅:

>>> 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 数组)。 为此,您必须首先将一维 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]直接将其a.reshape((-1, 1))(n, 1)数组. 我只是想演示转置数组的工作原理。

的转置

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

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

那么代码是:

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

或者简单的方法:

x.T     

这是更多信息的链接: http : //docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html

** 转置一维数组返回原始数组的未更改视图。 试试这个一维数组:

b = np.array([a])

我只是在巩固上面的帖子,希望它可以帮助其他人节省一些时间:

下面的数组有(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)

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

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

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

numpy函数的名称是column_stack

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

到目前为止,我已经学会了以紧凑和可读的方式为一维数组实现这一点的方式:

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 的数组。

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

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

np.expand_dims()将为所选轴添加一个维度。 在这种情况下,我们使用axis=1 ,它添加了一个列维度,有效地转置了您的原始平面数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM