问题:转置NumPy数组
我使用Python和NumPy,“移调”有一些问题:
import numpy as np
a = np.array([5,4])
print(a)
print(a.T)
调用a.T不转置数组。a例如,如果为,[[],[]]则它正确转置,但我需要的转置[...,...,...]。
回答 0
它的工作完全符合预期。一维数组的转置仍然是一维数组!(如果您习惯使用Matlab,从根本上讲就没有1D数组的概念。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!)。
回答 1
使用两对括号而不是一对。这将创建一个可以转置的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
对于一维数组:
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
您可以通过将现有矢量包装在一组额外的方括号中来将其转换为矩阵…
from numpy import *
v=array([5,4]) ## create a numpy vector
array([v]).T ## transpose a vector into a matrix
matrix(v).T ## transpose a vector into a matrix
回答 4
numpy 1D数组->列/行矩阵:
>>> a=np.array([1,2,4])
>>> a[:, None] # col
array([[1],
[2],
[4]])
>>> a[None, :] # row, or faster `a[None]`
array([[1, 2, 4]])
正如@乔金通说,你可以替换None使用np.newaxis的可读性。
回答 5
要将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
您只能转置2D阵列。您可以numpy.matrix用来创建2D阵列。这已经晚了三年,但我只是添加了可能的解决方案集:
import numpy as np
m = np.matrix([2, 3])
m.T
回答 7
而是arr[:,None]用来创建列向量
回答 8
转置
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/generation/numpy.transpose.html
回答 9
另一种解决方案…. :-)
import numpy as np
a = [1,2,4]
[1、2、4]
b = np.array([a]).T
数组([[1],[2],[4]])
回答 10
我只是合并以上帖子,希望它可以帮助其他人节省一些时间:
下面的数组具有(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)
回答 11
正如上面提到的一些评论,一维数组的转置是一维数组,因此转置一维数组的一种方法是将数组转换为矩阵,如下所示:
np.transpose(a.reshape(len(a), 1))
回答 12
中的函数名称numpy为column_stack。
>>>a=np.array([5,4])
>>>np.column_stack(a)
array([[5, 4]])
回答 13
有一种方法未在答案中描述,但在该方法的文档中进行了描述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
基本上,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)
如果是一维numpy数组(秩为1的数组),则形状和步幅为1元素元组,并且不能交换,而此类一维数组的转置将使其保持不变。相反,您可以将“行向量”(shape的numpy数组(1, n))转置为“列向量”(shape的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]])
当然,您不必这样做,因为您拥有一维数组,您可以(n, 1)通过a.reshape((-1, 1))或直接将其整形为数组a[:, None]。我只是想演示如何转置数组。
回答 15
到目前为止,我学会了以紧凑且可读的方式对一维数组进行实现的方法:
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的数组。


