Я использую Python и NumPy и у меня есть некоторые проблемы с «transpose»:
import numpy as np
a = np.array([5,4])
print(a)
print(a.T)
Вызов a.T
не транспонирует массив. Если a
это, например, [[],[]]
то он правильно транспонирует, но мне нужно транспонировать [...,...,...]
.
Ответы:
Это работает точно так, как и должно. Транспонирование одномерного массива все еще является одномерным массивом! (Если вы привыкли к matlab, у него принципиально нет концепции одномерного массива. Матрицы "1D" в Matlab являются двумерными.)
Если вы хотите превратить свой 1D-вектор в 2D-массив, а затем транспонировать его, просто нарежьте его
np.newaxis
(илиNone
они одинаковы,newaxis
просто более читабельно).Вообще говоря, вам не нужно беспокоиться об этом. Добавление дополнительного измерения обычно не то, что вы хотите, если вы просто делаете это по привычке. Numpy автоматически транслирует одномерный массив при выполнении различных вычислений. Обычно нет необходимости различать вектор строки и вектор столбца (ни один из которых не является вектором . Они оба 2D!), Когда вам нужен только вектор.
источник
np.arange
быстро создавал одномерный массив. Это работает точно так же дляa = np.array([5,4])
.()
не указывают на дополнительное измерение в numpy. Еслиa = np.arange(10)
затемa
вarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
качестве производстваa.__repr__()
. Это одномерный (то естьa.ndim --> 1
) вектор, как указано в квадратных скобках[]
.array( ... )
Не видно , когда вы либоprint(a)
илиa.__str__()
.np.vstack()
работа будет более явным:print np.vstack(a)
.Используйте две пары скобок вместо одной. Это создает 2D-массив, который можно транспонировать, в отличие от 1D-массива, который вы создаете, если используете одну пару скобок.
Более подробный пример:
Используйте
shape
метод numpy, чтобы увидеть, что здесь происходит:источник
Для одномерных массивов :
Как только вы поймете, что здесь -1 означает «столько строк, сколько необходимо», я нахожу, что это наиболее читаемый способ «транспонирования» массива. Если ваш массив имеет большую размерность, просто используйте
a.T
.источник
transpose
иreshape
изменение массива выполняются по- разному (результирующая форма изображения одинакова, но элементы размещаются по-разному).Вы можете преобразовать существующий вектор в матрицу, заключив его в дополнительный набор квадратных скобок ...
Numpy также имеет
matrix
класс (см. массив против матрицы ) ...источник
массив 1D -> матрица столбец / строка:
И как сказал @ Джо-Kington, вы можете заменить
None
сnp.newaxis
для удобства чтения.источник
Чтобы «транспонировать» 1d массив в 2d столбец, вы можете использовать
numpy.vstack
:Это также работает для списков ванили:
источник
vstack
?np.concatenate([atleast_2d(_m) for _m in tup], 0)
, Он разбивает массив на (1,1) и объединяет их! В процессе это делает копию, в то время как все измененные вид делают представление.Вы можете только транспонировать 2D-массив. Вы можете использовать
numpy.matrix
для создания 2D-массива. Это на три года позже, но я просто добавляю к возможному набору решений:источник
np.matrix
не требуется, и, как правило, не рекомендуется.вместо этого используйте
arr[:,None]
для создания вектора столбцаисточник
Транспонирование
является
ну код такой:
это ссылка для получения дополнительной информации:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.transpose.html
источник
Другое решение .... :-)
источник
Я просто объединяю вышеупомянутый пост, надеюсь, это поможет другим сэкономить время:
Массив ниже имеет
(2, )
размерность, это 1-D массив,Есть два способа транспонировать одномерный массив:
нарежьте его с "np.newaxis" или без.
Другой способ написания выше, без
T
операции.Обтекание [] или использование np.matrix означает добавление нового измерения.!
источник
Как уже упоминалось в некоторых комментариях, транспонирование 1D-массивов - это 1D-массивы, поэтому одним из способов транспонирования 1D-массива будет преобразование массива в матрицу следующим образом:
источник
Имя функции в
numpy
это column_stack .источник
Существует метод, не описанный в ответах, но описанный в документации к этому
numpy.ndarray.transpose
методу:Можно сделать:
Который (IMO) лучше, чем использовать
newaxis
.источник
По сути, функция транспонирования состоит в том, чтобы поменять местами форму и шаг массива:
В случае одномерного массива 1D (массив ранга 1) форма и шаги являются кортежами из 1 элемента и не могут быть заменены, и транспонирование такого массива 1D возвращает его без изменений. Вместо этого вы можете
(1, n)
преобразовать «вектор- строку» (массив фигур ) в «вектор-столбец» (массив фигур(n, 1)
). Чтобы достичь этого, вы должны сначала преобразовать свой массив 1D Numpy в вектор-строку, а затем поменять местами форму и шаг (переставить его). Ниже приведена функция, которая делает это:Пример:
Конечно, вам не нужно делать это таким образом, поскольку у вас есть одномерный массив, и вы можете напрямую преобразовать его в
(n, 1)
массив с помощьюa.reshape((-1, 1))
илиa[:, None]
. Я просто хотел продемонстрировать, как работает транспонирование массива.источник
Как я научился реализовывать это в компактной и удобочитаемой форме для 1-D массивов:
numpy.r_ и numpy.c_ переводят объекты среза в конкатенацию по первой и второй осям соответственно. Следовательно, разрезание v2 [:, 0] при перемещении обратно вертикального массива v2 в горизонтальный массив h2
numpy.vstack эквивалентен конкатенации вдоль первой оси после того, как одномерные массивы формы (N,) были преобразованы в (1, N). Восстанавливает массивы, разделенные на всплит .
источник