Как получить самый лучший способ получения максимальных значений поэлементно из "n" матриц в Python / Numpy - PullRequest
3 голосов
/ 30 сентября 2011

Привет, ребята, я хотел бы знать лучший лучший / оптимизированный способ получения максимальных значений элементарной матрицы "n" в Python / Numpy.

Например:

import numpy as np
matrices=[np.random.random((5,5)) for i in range(10)]
# the function np.maximum from numpy only works for two matrices.
max_matrix=np.maximum(matrices[0],matrices[1])
max_matrix=np.maximum(*matrices) # <- error

Как бы вы преодолели эту проблему?

Ответы [ 2 ]

5 голосов
/ 30 сентября 2011

Использование reduce:

reduce(np.maximum, matrices)

Из документов :

reduce ( функция , повторяемая [, инициализатор ])

применить функцию двух аргументов кумулятивно к элементам итерируемого, слева направо, чтобы уменьшить итерацию до одного значения. Например, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) вычисляет ((((1+2)+3)+4)+5). Левый аргумент x - это накопленное значение и правильный аргумент y - это значение обновления из итерируемого. Если необязательный инициализатор присутствует, он помещается перед элементами повторяется в расчете и служит по умолчанию, когда повторяемый пустой. Если инициализатор не задан и итеративный содержит только один товар, первый товар возвращается.

3 голосов
/ 30 сентября 2011
import numpy as np
matrices=[np.random.random((5,5)) for i in range(10)]
np.max(np.hstack(matrices))

Даст вам максимальное значение из всех n матриц. Это в основном объединяет все матрицы в matrices в один массив, используя np.hstack, а затем берет максимум этого нового массива. Это предполагает, что все ваши матрицы имеют одинаковое количество строк. Вы также можете использовать np.vstack или np.concatenate для достижения аналогичного эффекта.

Редактировать Я перечитал ваш вопрос, и вы, возможно, захотите что-то более похожее на:

np.max(np.dstack(matrices),axis=2)

Это позволит сложить все ваши матрицы вдоль третьей оси, а затем даст вам максимум в этом направлении, возвращая матрицу 5x5 для вашего случая.

Редактировать # 2 Вот некоторые моменты:

In [33]: matrices = [np.random.random((5,5)) for i in range(10)]

In [34]: %timeit np.dstack(matrices).max(2)
10000 loops, best of 3: 92.6 us per loop

In [35]: %timeit np.array(matrices).max(axis=0)
10000 loops, best of 3: 90.9 us per loop

In [36]: %timeit reduce(np.maximum, matrices)
10000 loops, best of 3: 25.8 us per loop

и для некоторых больших массивов:

In [37]: matrices = [np.random.random((200,200)) for i in range(100)]

In [38]: %timeit np.dstack(matrices).max(2)
10 loops, best of 3: 111 ms per loop

In [39]: %timeit np.array(matrices).max(axis=0)
1 loops, best of 3: 697 ms per loop

In [40]: %timeit reduce(np.maximum, matrices)
100 loops, best of 3: 12.7 ms per loop

Стивен выигрывает!

...