Если вы просто будете иметь дело с одномерными массивами, то вы можете использовать следующее, где массив должен создаваться вне функции. Кажется, нет никакой причины использовать vectorize
здесь, вы можете достичь цели просто с помощью jit
, хотя вы должны явно записать цикл над элементами массива, используя это. Если ваш массив всегда будет 1D, то вы можете использовать:
import numpy as np
from numba import jit
@jit(nopython=True)
def particle_path(out):
for i in range(len(out)):
x = 0
for _ in range(10):
x += np.random.uniform(0, 1)
out[i] = x
arr = np.empty(1024, dtype=np.int32)
particle_path(arr)
Аналогичным образом вы можете работать с произвольными массивами, используя атрибут flat
(и обязательно используйте .size
для получения общего количества элементов в массиве):
@jit(nopython=True)
def particle_path(out):
for i in range(out.size):
x = 0
for _ in range(10):
x += np.random.uniform(0, 1)
out.flat[i] = x
arr = np.empty(1024, dtype=np.int32)
particle_path(arr)
и, наконец, вы можете создать свой массив внутри своей функции, если вам нужен новый массив каждый раз, когда вы запускаете функцию (используйте вышеупомянутое вместо, если вы будете вызывать функцию повторно и хотите перезаписать один и тот же массив, сохраняя, таким образом, время перераспределять один и тот же массив снова и снова).
@jit(nopython=True)
def particle_path(num):
out = np.empty(shape=num, dtype=np.int32)
for i in range(num):
x = 0
for _ in range(10):
x += np.random.uniform(0, 1)
out[i] = x
return out
arr = particle_path(1024)