Проверка некоторых ваших значений:
In [446]: ddl_nl = np.array([0,1])
...: ij = np.asarray(np.meshgrid(ddl_nl,ddl_nl,indexing='ij'))
...:
In [447]: ij
Out[447]:
array([[[0, 0],
[1, 1]],
[[0, 1],
[0, 1]]])
In [448]: n_t = 8
...: q_ddl = 2
...: n_ddl = 3
In [449]: d_i = np.zeros((n_ddl,n_ddl))
In [450]: d_i
Out[450]:
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
In [451]: d_i[ij[0], ij[1]]
Out[451]:
array([[0., 0.],
[0., 0.]])
попробуйте больше диагнозов c d_i
:
In [452]: d_i = np.arange(9).reshape(3,3)
In [453]: d_i[ij[0], ij[1]]
Out[453]:
array([[0, 1],
[3, 4]])
In [454]: d_i[:2,:2]
Out[454]:
array([[0, 1],
[3, 4]])
Почему вы используете расширенную индексацию, когда базовая c нарезка будет работать?
Я не пробовал это с numba
, но у него больше шансов на работу. Тем не менее, перечисленное l oop может быть столь же быстрым. У меня недостаточно опыта работы с numba
, чтобы сказать наверняка.
===
Очевидно, вы выполнили операцию numpy
, которую numba
не поддерживает:
In [456]: numba.__version__
Out[456]: '0.43.0'
In [457]: @numba.jit
...: def foo(arr):
...: return arr[[1,2,3],[1,2,3]]
...:
In [458]: foo(np.eye(4))
Out[458]: array([1., 1., 1.])
In [459]: @numba.njit
...: def foo(arr):
...: return arr[[1,2,3],[1,2,3]]
...:
In [460]: foo(np.eye(4))
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Invalid use of Function(<built-in function getitem>) with argument(s) of type(s): (array(float64, 2d, C), tuple(list(int64) x 2))
Это не необычно. numba
не претендует на полное покрытие Python
или numpy
.
Но с numba
нам не нужно избегать итерации. На самом деле это лучше всего при замене операции, которую numpy
не может обойтись без итерации.
In [465]: @numba.njit
...: def foo(arr):
...: out = np.zeros((3,), arr.dtype)
...: for n, (i,j) in enumerate(zip([1,2,3],[1,2,3])):
...: out[n] = arr[i,j]
...: return out
In [466]: foo(np.eye(4))
Out[466]: array([1., 1., 1.])
In [467]: timeit foo(np.eye(4))
6.85 µs ± 28.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [468]: np.eye(4)[[1,2,3],[1,2,3]]
Out[468]: array([1., 1., 1.])
In [469]: timeit np.eye(4)[[1,2,3],[1,2,3]]
13.3 µs ± 31.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)