Иногда вам просто нужны временные arryas, и вы не можете переписать
x[1:-1] += 5*x[2:]
как операции на вид.
Аналоговые вычисления на месте, когда вам нужны временные массивы, является создание нескольких временных массивов и использование их для вывода на каждом этапе вычисления. У вас все еще есть немного больше математики указателей, но вам не придется создавать пространство в памяти более одного раза. Затем вы можете переписать строку выше:
np.multiply(x[2:], 5, out=temp)
x[1:-1] += temp
Здесь, я полагаю, temp
имеет размер x[-1:1]
что то, что я обычно делаю для этого общего вопроса борьбы с границами.
С вычислениями в месте вы не можете запустить точное уравнение с timeit много раз, потому что числа растут в геометрической прогрессии, но вот тест с 5x заменен 1x:
import numpy as np
from timeit import timeit
N = 100000000
x = np.arange(N, dtype=np.int)
temp = np.zeros((N-2,), dtype=np.int)
def f0(x, temp):
x[1:-1] += 1*x[2:]
def f1(x, temp):
np.multiply(x[1:-1], 1, out=temp)
x[1:-1] += temp
print timeit("f0(x, temp)", "from __main__ import f0, f1, x, temp", number=100)
print timeit("f1(x, temp)", "from __main__ import f0, f1, x, temp", number=100)
, который дает:
71.543628931
44.719383955
# or, for N /= 100, and number *= 10
5.37844896317
4.50015997887
и для гораздо меньших массивов подход массива out
может замедляться.
Вы можете сделать это одним движением, на месте –