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

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

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


当前回答

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

>>> 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. remodeling((-1, 1))或a[:, None]将它重塑为(n, 1)数组。我只是想演示一下如何对数组进行转置。

其他回答

对于1D数组:

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。

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

>>> 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. remodeling((-1, 1))或a[:, None]将它重塑为(n, 1)数组。我只是想演示一下如何对数组进行转置。

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

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

有一个方法没有在答案中描述,但在文档中描述了numpy. narray .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)

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