Почти все операции с клочками выполняются поэлементно.Поэтому вместо написания явного цикла попробуйте определить k
, используя формулу на основе массива:
r_shifted = np.roll(x, shift = 1)
k = ... # some formula in terms of u, M, r, r_shifted
Например, вместо
import numpy as np
N=5
k = np.zeros(N, dtype=np.float)
u = np.ones(N, dtype=np.float)
M = np.ones(N, dtype=np.float)
r = np.ones(N, dtype=np.float)
for i in xrange(N):
k[i] = u[i] + M[i] + r[i] + r[i-1]
print(k)
# [ 4. 4. 4. 4. 4.]
используйте:
r_shifted = np.roll(r, shift = 1)
k = u + M + r + r_shifted
print(k)
# [ 4. 4. 4. 4. 4.]
np.roll (r, shift = 1) возвращает новый массив того же размера, что и r
, с r_shifted[i] = r[i-1]
для i = 0, ..., N-1
.
In [31]: x = np.arange(5)
In [32]: x
Out[32]: array([0, 1, 2, 3, 4])
In [33]: np.roll(x, shift = 1)
Out[33]: array([4, 0, 1, 2, 3])
Для создания копии, подобной этой, требуется больше памяти (того же размера, что и r
), но она позволяет выполнять быстрые операции с пустыми текстами вместо медленного цикла Python.
Иногда формулавместо k
может быть определено в терминах r[:-1]
и r[1:]
.Примечание r[:-1]
и r[1:]
- это кусочки r
и одинаковой формы.В этом случае вам не нужна дополнительная память, поскольку базовые фрагменты r
- это так называемые представления из r
, а не копии.
Я не определил k
таким образом в приведенном выше примере, потому что тогда k
имел бы длину N-1
вместо N
, так что это немного отличалось бы от того, что мог бы создать ваш исходный код.