Транспонирование массива NumPy
я использую Python и NumPy и имею некоторые проблемы с "транспонированием":
a=array([5,4])
print a
print a.T
вызов a.T
не транспонирует массив. Если a
к примеру [[],[]]
тогда он транспонирует правильно, но мне нужно транспонировать [...,...,...]
.
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
более подробный пример:
использовать и NumPy это!--3--> метод, чтобы увидеть, что происходит здесь:>>> 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]])
>>> 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]])