Транспонирование массива NumPy


я использую Python и NumPy и имею некоторые проблемы с "транспонированием":

a=array([5,4])
print a
print a.T

вызов a.T не транспонирует массив. Если a к примеру [[],[]] тогда он транспонирует правильно, но мне нужно транспонировать [...,...,...].

13 117

13 ответов:

он работает именно так, как и должен. Транспонирование a 1D массив по-прежнему 1D массив! (Если вы привыкли к matlab, он принципиально не имеет понятия 1D-массива. Массивы "1D" Matlab являются 2D.)

если вы хотите превратить ваш 1D вектор в 2D массив, а затем транспонировать его, просто нарезать его с np.newaxis (или None, Они же newaxis просто более читаемый).

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

вообще говоря, хотя, вы никогда не делаете нужно об этом беспокоиться. Добавление дополнительного измерения обычно не то, что вы хотите, если вы просто делаете это по привычке. Numpy будет автоматически транслировать массив 1D при выполнении различных вычислений. Обычно нет необходимости различать вектор строки и вектор столбца (ни один из которых не векторы. Они оба 2D!) когда вы просто хотите вектор.

используйте две пары скобок вместо одной. Это создает 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 это!--3--> метод, чтобы увидеть, что происходит здесь:
>>> 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 THE TRICK

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

Как только вы поймете, что -1 здесь означает "столько строк, сколько необходимо", я считаю, что это самый читаемый способ "транспонирования" массива.

вы можете преобразовать существующий вектор в матрицу, заключив его в дополнительный набор квадратных скобок...

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

массив 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]])

и как сказал @joe-kington, вы можете заменить None С np.newaxis для удобства чтения.

чтобы "транспонировать" 1D массив в 2d столбец, вы можете использовать numpy.vstack:

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

Он также работает для списков ванили:

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

вы можете транспонировать только 2D массив. Вы можете использовать numpy.matrix для создания 2D массива. Это на три года позже, но я просто добавляю к возможному набору решений:

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

транспонирование

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/generated/numpy.transpose.html

как некоторые из вышеупомянутых комментариев, транспонирование 1D массивов - это 1D массивы, поэтому один из способов транспонировать 1D массив - это преобразовать массив в матрицу следующим образом:

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

имя функции в numpy и column_stack.

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

другое решение.... : -)

import numpy as np

a = [1,2,4]

[1, 2, 4]

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

массив([[1], [2], [4]])

вместо этого используйте arr [:, None] для создания столбца vector

транспонирование [5,4] в [5,4], ну на самом деле

[5,
 4]

PS: есть простой способ транспонировать 2D матрицу -

zip(*a)