Чтобы в полной мере использовать скорость numpy, вы хотите создать ufuncs , когда это возможно. Применение vectorize
к функции, как предлагает mgibsonbr , является одним из способов сделать это, но лучшим способом, если это возможно, является простое создание функции, которая использует преимущества встроенных функций numpy. Вот как то так:
>>> import numpy
>>> a = numpy.random.random(10)
>>> a + 1
array([ 1.29738145, 1.33004628, 1.45825441, 1.46171177, 1.56863326,
1.58502855, 1.06693054, 1.93304272, 1.66056379, 1.91418473])
>>> (a + 1) * 0.25 / 4
array([ 0.08108634, 0.08312789, 0.0911409 , 0.09135699, 0.09803958,
0.09906428, 0.06668316, 0.12081517, 0.10378524, 0.11963655])
Какова природа функции, которую вы хотите применить к массиву numpy? Если вы сообщите нам, возможно, мы сможем помочь вам создать версию, которая использует только numpy ufuncs.
Также возможно генерировать массив индексов без использования enumerate
. Numpy предоставляет ndenumerate
, который является итератором и, вероятно, медленнее, но он также предоставляет indices
, который является очень быстрым способом генерирования индексов, соответствующих значениям в массив. Итак ...
>>> numpy.indices(a.shape)
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
Чтобы быть более точным, вы можете использовать вышеперечисленное и комбинировать их, используя numpy.rec.fromarrays
:
>>> a = numpy.random.random(10)
>>> ind = numpy.indices(a.shape)
>>> numpy.rec.fromarrays([ind[0], a])
rec.array([(0, 0.092473494150913438), (1, 0.20853257641948986),
(2, 0.35141455604686067), (3, 0.12212258656960817),
(4, 0.50986868372639049), (5, 0.0011439325711705139),
(6, 0.50412473457942508), (7, 0.28973489788728601),
(8, 0.20078799423168536), (9, 0.34527678271856999)],
dtype=[('f0', '<i8'), ('f1', '<f8')])
Звучит так, будто ваша главная задача - выполнить операцию на месте. Это сложнее сделать с помощью vectorize
, но это легко сделать с помощью подхода ufunc:
>>> def somefunc(a):
... a += 1
... a /= 15
...
>>> a = numpy.random.random(10)
>>> b = a
>>> somefunc(a)
>>> a
array([ 0.07158446, 0.07052393, 0.07276768, 0.09813235, 0.09429439,
0.08561703, 0.11204622, 0.10773558, 0.11878885, 0.10969279])
>>> b
array([ 0.07158446, 0.07052393, 0.07276768, 0.09813235, 0.09429439,
0.08561703, 0.11204622, 0.10773558, 0.11878885, 0.10969279])
Как видите, numpy выполняет эти операции на месте.