转置一维NumPy数组
我在使用Python和NumPy时遇到了一些关于“转置”的问题:
import numpy as np
a = np.array([5,4])
print(a)
print(a.T)
调用 a.T
并没有正确地转置数组。如果 a
比如是 [[],[]]
,那么它能正确转置,但我需要的是 [...,...,...]
的转置。
15 个回答
119
对于一维数组:
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
。
180
使用两个括号对,而不是一个。这会创建一个二维数组,这种数组可以进行转置,而如果你只用一个括号对,就只能创建一维数组。
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)
314
它的工作方式完全正常。一个一维数组的转置仍然是一个一维数组!如果你习惯用matlab的话,可能会觉得它根本没有一维数组的概念。matlab里的“一维”数组其实是二维的。
如果你想把你的一维向量变成二维数组,然后再转置,可以用 np.newaxis
(或者 None
,它们是一样的,newaxis
只是更容易理解)。
import numpy as np
a = np.array([5,4])[np.newaxis]
print(a)
print(a.T)
不过一般来说,你不需要太担心这个。如果你只是出于习惯添加额外的维度,通常这并不是你想要的。Numpy在进行各种计算时会自动处理一维数组。通常情况下,当你只想要一个向量时,没必要区分行向量和列向量(其实它们都不是“向量”,它们都是二维的!)。