Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Используйте две пары скобок вместо одной. Это создает 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)

Ответ 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.

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

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

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

Ответ 9

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

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

Ответ 10

Название функции в numpy column_stack.

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

Ответ 11

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

import numpy as np

a = [1,2,4]

[1, 2, 4]

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

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

Ответ 12

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

Ответ 13

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

Приведенный ниже массив имеет размер (2, ), это массив 1-D,

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)

Ответ 14

Транспонирование [5,4] - [5,4], ну собственно

[5,
 4]

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

zip(*a)