Применить функцию к 3 элементам одновременно в NumPy - PullRequest
1 голос
/ 02 марта 2011

Я хотел бы применить функцию к одномерному массиву по 3 элемента за раз и вывести для каждого из них отдельный элемент.

например, у меня есть массив из 13 элементов:

a = np.arange(13)**2

и я хочу применить функцию, скажем, np.std в качестве примера.

Вот эквивалентное понимание списка:

[np.std(a[i:i+3]) for i in range(0, len(a),3)] 
[1.6996731711975948,
 6.5489609014628334,
 11.440668201153674,
 16.336734339790461,
 0.0]

Кто-нибудь знает более эффективный способ использования numpy функций?

Ответы [ 3 ]

5 голосов
/ 02 марта 2011

Самый простой способ - изменить его форму и применить функцию вдоль оси.

import numpy as np
a = np.arange(12)**2
b = a.reshape(4,3)
print np.std(b, axis=1)

Если вам нужна чуть лучшая производительность, , вы можете попробовать stride_tricks . Ниже то же самое, что и выше, за исключением использования stride_tricks. Я ошибся в увеличении производительности, потому что, как вы можете видеть ниже, b становится точно таким же, как и b выше. Я не удивлюсь, если они составят одно и то же.

import numpy as np
a = np.arange(12)**2
b = np.lib.stride_tricks.as_strided(a, shape=(4,3), strides=(a.itemsize*3, a.itemsize))
print np.std(b, axis=1)
0 голосов
/ 02 марта 2011

Вы можете изменить это.Но это требует, чтобы размер не изменился.Если вы можете добавить некоторые фиктивные записи в конце, вы можете сделать это:

[np.std(s) for s in a.reshape(-1,3)]
0 голосов
/ 02 марта 2011

Вы говорите о чем-то вроде векторизации? http://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...