Транспонирование массива NumPy - PullRequest
152 голосов
/ 10 мая 2011

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

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

Invoking a.T не транспонирует массив. Если a, например, [[],[]], то оно корректно транспонируется, но мне нужна транспонирование [...,...,...].

Ответы [ 13 ]

203 голосов
/ 10 мая 2011

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

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

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

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

115 голосов
/ 11 мая 2012

Используйте две пары скобок вместо одной.Это создает двумерный массив, который можно транспонировать, в отличие от создаваемого вами массива 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's shape метод, чтобы увидеть, что здесь происходит:

>>> b = np.array([10,20,30])
>>> b.shape
(3,)
>>> b = np.array([[10,20,30]])
>>> b.shape
(1, 3)
66 голосов
/ 04 апреля 2016

Для одномерных массивов :

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.

17 голосов
/ 13 февраля 2013

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

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
13 голосов
/ 26 ноября 2014

массив 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 для удобства чтения.

9 голосов
/ 28 апреля 2017

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

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

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

>>> numpy.vstack([1,2,3])
array([[1],
       [2],
       [3]])
3 голосов
/ 18 февраля 2015

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

import numpy as np
m = np.matrix([2, 3])
m.T
1 голос
/ 11 декабря 2018

Я просто объединяю рассмотренный выше пост, надеюсь, это поможет другим сэкономить время:

Массив ниже имеет размер (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)

Wrapping [] или использование np.matrix,означает добавление нового измерения.!

print(np.array([b_new]).T.shape)
print(np.matrix(b_new).T.shape)
1 голос
/ 25 апреля 2017

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

import numpy as np

a = [1,2,4]

[1, 2, 4]

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

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

1 голос
/ 24 ноября 2014

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

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

...