簡體   English   中英

轉置一維 NumPy 數組

[英]Transposing a 1D NumPy array

我使用 Python 和 NumPy 並且“轉置”有一些問題:

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

調用aT不是轉置數組。 如果a是例如[[],[]]那么它正確轉置,但我需要[...,...,...]的轉置。

它完全按照預期工作。 數組的轉置仍然是一維數組! (如果你習慣使用 matlab,它基本上沒有一維數組的概念。Matlab 的“一維”數組是二維的。)

如果你想把你的一維向量變成一個二維數組然后轉置它,只需用np.newaxis切片(或None ,它們是一樣的, newaxis只是更具可讀性)。

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

不過,一般來說,您無需擔心這一點。 如果您只是出於習慣,添加額外維度通常不是您想要的。 Numpy 在進行各種計算時會自動廣播一個一維數組。 當您只需要一個向量時,通常不需要區分行向量和列向量(兩者都不是向量。它們都是二維的!)。

使用兩個括號對而不是一個。 這將創建一個可以轉置的二維數組,這與使用一對括號創建的一維數組不同。

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 在這里的意思是“根據需要盡可能多的行”,我發現這是“轉置”數組的最易讀的方式。 如果您的數組具有更高的維度,只需使用aT

您可以通過將現有向量包裝在一組額外的方括號中來將其轉換為矩陣...

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

numpy 也有一個matrix類(參見array vs. matrix )...

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

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 所說,您可以用np.newaxis替換None以提高可讀性。

要將一numpy.vstack數組“轉置”為二維列,您可以使用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]創建列向量

另一個解決方案...... :-)

import numpy as np

a = [1,2,4]

[1, 2, 4]

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

數組([[1], [2], [4]])

基本上,轉置函數所做的是交換數組的形狀和步幅:

>>> 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 數組的轉置返回它不變。 相反,您可以將“行向量”(形狀為(1, n) numpy 數組)轉置為“列向量”(形狀為(n, 1) numpy 數組)。 為此,您必須首先將一維 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.reshape((-1, 1))a[:, None]直接將其a.reshape((-1, 1))(n, 1)數組. 我只是想演示轉置數組的工作原理。

的轉置

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 ,它添加了一個列維度,有效地轉置了您的原始平面數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM