我使用 Python 和 NumPy 并且在“转置”方面遇到了一些问题:
import numpy as np
a = np.array([5,4])
print(a)
print(a.T)
调用a.T
不是转置数组。a
例如,如果是,[[],[]]
那么它可以正确转置,但我需要[...,...,...]
.
它完全按照它应该的方式工作。一维数组的转置仍然是一维数组!(如果你习惯于 matlab,它基本上没有一维数组的概念。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 数组,这与使用一对括号创建的 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)
对于一维数组:
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 一维数组->列/行矩阵:
>>> 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
以提高可读性。
要将一维数组“转置”为二维列,您可以使用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]
创建列向量
基本上转置函数所做的是交换数组的形状和步幅:
>>> 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 数组的转置返回它不变。相反,您可以将“行向量”(形状的 numpy 数组(1, n)
)转换为“列向量”(形状的 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]])
当然你不必这样做,因为你有一个一维数组,你可以通过or直接将它重塑为(n, 1)
数组。我只是想演示转置数组的工作原理。a.reshape((-1, 1))
a[:, None]
另一个解决方案.... :-)
import numpy as np
a = [1,2,4]
[1, 2, 4]
b = np.array([a]).T
数组([[1],[2],[4]])
的转置
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
,它添加了一个列维度,有效地转置了您的原始平面数组。