Матрична матриця для масиву


149

Я використовую 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
З мого боку маленька рента ... чому numpy має масиви та матриці як окремі об'єкти. Це так непіфонічно ІМХО. Дякую за цю пораду @Joe.
Найджаба

6
@Naijaba - Для чого це варто, матричний клас ефективно (але не формально) знецінюється. Він там здебільшого для історичних цілей. Видалення numpy.matrix- це доволі спірне питання, але нумеровані диски дуже погоджуються з вами, що наявність обох є непітонічною і дратівливою з цілого ряду причин. Однак кількість старого, незбереженого коду "в дикій природі", який використовується, matrixускладнює повне його видалення.
Джо Кінгтон

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

1
Рідкі матриці є основними для машинного навчання в пам'яті (наприклад, sklearn). Насправді існують різні sparse matrixтипи scipy, які дозволяють ефективно отримувати доступ через рядки чи стовпці. Я думаю, це може бути проблемою для об'єднання понять матриці та масиву. З цього sparse arrayприводу мені цікаво, чи можна було б запровадити тип і чи є якісь плани для цього. Будь-які підказки?
пмс

Я думаю, що .flatten () працює так само, як і .squeeze (), якщо ви хочете, нарешті, 1D масив.
словаззаду

122

6
Я думаю, що ця відповідь є кращою за прийняту відповідь, ефективність та простота
dariush

M.A1 чудова, та ж реалізація, як "ravel" і "flatten", і в цьому випадку не викликає жодної копії даних A, таким чином, залишається пов'язаною з M, що може викликати сюрпризи, якщо A і / або M змінюються. Справжній альтернативний повертаючий генератор M.flat (семантика лише для читання) M, -1) # - це звичайно вигляд залежно від сумісності форми, цей "-1" - це круговий спосіб зробити A1 /
ravel

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

залежить, що ви маєте на увазі під елегантністю, я гадаю, але ось, що я би робив


11

Ви можете спробувати наступний варіант:

result=np.array(M).flatten()

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 - це дві техніки, які я б тут спробував. Я хотів би додати до стовпів зроблених Джо , Siraj , міхур і KEVAD .

Ravel:

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.