转置NumPy数组

问题:转置NumPy数组

我使用Python和NumPy,“移调”有一些问题:

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

调用a.T不转置数组。a例如,如果为,[[],[]]则它正确转置,但我需要的转置[...,...,...]

I use Python and NumPy and have some problems with “transpose”:

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

Invoking a.T is not transposing the array. If a is for example [[],[]] then it transposes correctly, but I need the transpose of [...,...,...].


回答 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!)。

It’s working exactly as it’s supposed to. The transpose of a 1D array is still a 1D array! (If you’re used to matlab, it fundamentally doesn’t have a concept of a 1D array. Matlab’s “1D” arrays are 2D.)

If you want to turn your 1D vector into a 2D array and then transpose it, just slice it with np.newaxis (or None, they’re the same, newaxis is just more readable).

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

Generally speaking though, you don’t ever need to worry about this. Adding the extra dimension is usually not what you want, if you’re just doing it out of habit. Numpy will automatically broadcast a 1D array when doing various calculations. There’s usually no need to distinguish between a row vector and a column vector (neither of which are vectors. They’re both 2D!) when you just want a vector.


回答 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)

Use two bracket pairs instead of one. This creates a 2D array, which can be transposed, unlike the 1D array you create if you use one bracket pair.

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

More thorough example:

>>> 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]])

Use numpy’s shape method to see what is going on here:

>>> 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

For 1D arrays:

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

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

Once you understand that -1 here means “as many rows as needed”, I find this to be the most readable way of “transposing” an array. If your array is of higher dimensionality simply use a.T.


回答 3

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

from numpy import *
v=array([5,4]) ## create a numpy vector
array([v]).T ## transpose a vector into a matrix

numpy也有一个matrix类(请参阅数组与矩阵)。

matrix(v).T ## transpose a vector into a matrix

You can convert an existing vector into a matrix by wrapping it in an extra set of square brackets…

from numpy import *
v=array([5,4]) ## create a numpy vector
array([v]).T ## transpose a vector into a matrix

numpy also has a matrix class (see array vs. 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的可读性。

numpy 1D array –> column/row matrix:

>>> a=np.array([1,2,4])
>>> a[:, None]    # col
array([[1],
       [2],
       [4]])
>>> a[None, :]    # row, or faster `a[None]`
array([[1, 2, 4]])

And as @joe-kington said, you can replace None with np.newaxis for readability.


回答 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]])

To ‘transpose’ a 1d array to a 2d column, you can use numpy.vstack:

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

It also works for vanilla lists:

>>> 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

You can only transpose a 2D array. You can use numpy.matrix to create a 2D array. This is three years late, but I am just adding to the possible set of solutions:

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

回答 7

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

instead use arr[:,None] to create column vector


回答 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

The transpose of

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

is

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

well the code is:

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

this a link for more information:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html


回答 9

另一种解决方案…. :-)

import numpy as np

a = [1,2,4]

[1、2、4]

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

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

Another solution…. :-)

import numpy as np

a = [1,2,4]

[1, 2, 4]

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

array([[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)

I am just consolidating the above post, hope it will help others to save some time:

The below array has (2, )dimension, it’s a 1-D array,

b_new = np.array([2j, 3j])  

There are two ways to transpose a 1-D array:


slice it with “np.newaxis” or none.!

print(b_new[np.newaxis].T.shape)
print(b_new[None].T.shape)

other way of writing, the above without T operation.!

print(b_new[:, np.newaxis].shape)
print(b_new[:, None].shape)

Wrapping [ ] or using np.matrix, means adding a new dimension.!

print(np.array([b_new]).T.shape)
print(np.matrix(b_new).T.shape)

回答 11

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

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

As some of the comments above mentioned, the transpose of 1D arrays are 1D arrays, so one way to transpose a 1D array would be to convert the array to a matrix like so:

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

回答 12

中的函数名称numpycolumn_stack

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

The name of the function in numpy is 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

There is a method not described in the answers but described in the documentation for the numpy.ndarray.transpose method:

For a 1-D array this has no effect, as a transposed vector is simply the same vector. To convert a 1-D array into a 2D column vector, an additional dimension must be added. np.atleast2d(a).T achieves this, as does a[:, np.newaxis].

One can do:

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

Which (imo) is nicer than using 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]。我只是想演示如何转置数组。

Basically what the transpose function does is to swap the shape and strides of the array:

>>> 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)

In case of 1D numpy array (rank-1 array) the shape and strides are 1-element tuples and cannot be swapped, and the transpose of such an 1D array returns it unchanged. Instead, you can transpose a “row-vector” (numpy array of shape (1, n)) into a “column-vector” (numpy array of shape (n, 1)). To achieve this you have to first convert your 1D numpy array into row-vector and then swap the shape and strides (transpose it). Below is a function that does it:

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])

Example:

>>> 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]])

Of course you don’t have to do it this way since you have a 1D array and you can directly reshape it into (n, 1) array by a.reshape((-1, 1)) or a[:, None]. I just wanted to demonstrate how transposing an array works.


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

The way I’ve learned to implement this in a compact and readable manner for 1-D arrays, so far:

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_ and numpy.c_ translate slice objects to concatenation along the first and second axis, respectively. Therefore the slicing v2[:,0] in transposing back the vertical array v2 into the horizontal array h2

numpy.vstack is equivalent to concatenation along the first axis after 1-D arrays of shape (N,) have been reshaped to (1,N). Rebuilds arrays divided by vsplit.