Матрица в массиве


150

Я использую NumPy. У меня есть матрица с 1 столбцом и N строк, и я хочу получить массив из N элементов.

Например, если у меня есть M = matrix([[1], [2], [3], [4]]), я хочу получить A = array([1,2,3,4]).

Для достижения этого я использую A = np.array(M.T)[0]. Кто-нибудь знает более элегантный способ получить тот же результат?

Спасибо!


Ответы:


192

Если вы хотите что-то более читабельное, вы можете сделать это:

A = np.squeeze(np.asarray(M))

Эквивалентно, вы также можете сделать:, A = np.asarray(M).reshape(-1)но это немного сложнее для чтения.


9
Маленькая напыщенная речь с моей стороны ... почему у numy есть массивы и матрицы как отдельные объекты. Это так непривычно ИМХО. Спасибо за этот совет @Joe.
Найджаба

6
@ Найджаба - Для чего это стоит, класс матрицы эффективно (но не формально) амортизируется. Это там в основном для исторических целей. Удаление numpy.matrix- это немного спорный вопрос, но недоверчивые разработчики очень согласны с вами в том, что наличие обоих является непитонным и раздражающим по целому ряду причин. Однако количество старого, не поддерживаемого кода «в дикой природе», которое использует matrixего, затрудняет его полное удаление.
Джо Кингтон

1
Не говоря уже о том, что истинное умножение матриц было добавлено только для массивов в Numpy 1.10 и в основном все еще находится в бета-версии. Это означает, что многим людям (включая меня) все еще приходится использовать матрицы вместо массивов, чтобы выполнить то, что мы хотим. docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
Жорж Оутс Ларсен

1
Разреженные матрицы являются основополагающими для машинного обучения с эффективным использованием памяти (например, sklearn). На самом деле существуют различные sparse matrixтипы scipy, которые позволяют эффективный доступ через строки или столбцы. Я полагаю, что это может быть проблемой для объединения концепций матрицы и массива. Тем не менее, мне интересно, можно ли было бы также ввести sparse arrayтип и есть ли планы сделать это. Есть какие-нибудь подсказки?
pms

Я думаю .flatten () работает так же, как и .squeeze (), если вам нужен 1D массив в конце.
словами

122

6
Я думаю, что этот ответ лучше, чем принятый ответ, с точки зрения производительности и простоты
dariush

M.A1 великолепен, такая же реализация, что и «ravel» и «flatten», и в этом случае не приводит к тому, что какая-либо копия данных A остается связанной с M, что может вызвать неожиданность, если A и / или M изменчивы. Подлинная альтернатива M.flat, возвращающая генератор "flatiter" (семантика только для чтения) np.squeeze (M) # дает представление, удаляющее размеры размера 1, здесь тоже хорошо, но не гарантировано, что оно будет 1-м для общего M np.reshape ( M, -1) # обычно является видом в зависимости от совместимости формы, этот «-1» является окольным способом сделать A1 / ravel /
flatten

13
A, = np.array(M.T)

зависит от того, что вы подразумеваете под элегантностью я полагаю, но это то, что я хотел бы сделать



7
np.array(M).ravel()

Если вы заботитесь о скорости; Но если вы заботитесь о памяти:

np.asarray(M).ravel()

Было бы лучше качество вашего ответа, если бы вы объяснили почему
Мило Вельондек

6

Или вы можете попытаться избежать некоторых временных

A = M.view(np.ndarray)
A.shape = -1

2

Во-первых, Mv = numpy.asarray(M.T)который дает вам массив 4x1, но 2D.

Затем выполните A = Mv[0,:], что дает вам то, что вы хотите. Вы могли бы собрать их вместе, как numpy.asarray(M.T)[0,:].



0

Функции ravel () и flatten () из numpy - это два метода, которые я бы попробовал здесь. Я хотел бы добавить к сообщениям, сделанным Джо , Сираджем , Бублом и Кевадом .

Равель:

A = M.ravel()
print A, A.shape
>>> [1 2 3 4] (4,)

Свести:

M = np.array([[1], [2], [3], [4]])
A = M.flatten()
print A, A.shape
>>> [1 2 3 4] (4,)

numpy.ravel()быстрее , так как это функция уровня библиотеки, которая не делает никакой копии массива. Однако любое изменение в массиве A будет перенесено в исходный массив M, если вы используетеnumpy.ravel() .

numpy.flatten()медленнее, чемnumpy.ravel() . Но если вы используете numpy.flatten()для создания А, то изменения в не будут перенесены на оригинальный массив M .

numpy.squeeze()и M.reshape(-1)медленнее, чем numpy.flatten()и numpy.ravel().

%timeit M.ravel()
>>> 1000000 loops, best of 3: 309 ns per loop

%timeit M.flatten()
>>> 1000000 loops, best of 3: 650 ns per loop

%timeit M.reshape(-1)
>>> 1000000 loops, best of 3: 755 ns per loop

%timeit np.squeeze(M)
>>> 1000000 loops, best of 3: 886 ns per loop
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.