Непоследовательное предупреждение о смежных массивах со словарями и Numba?Python

Программы на Python
Anonymous
Непоследовательное предупреждение о смежных массивах со словарями и Numba?

Сообщение Anonymous »

Вот функция, которую я использую для вычисления матриц:

Код: Выделить всё

@jit(nopython=True, fastmath=True, cache=True)
def ti_matrices(in_mat, dt):

# Definition of the matrices for ti
mat0 = in_mat['rot_M']*1/(dt**2) + in_mat['rot_D']*1/(2*dt)
mat1 = in_mat['rot_K'] - in_mat['rot_M']*2/(dt**2)
mat0_inv = inv(mat0)
in_mat['sch_invA'] = (mat0_inv+mat0_inv.T)/2
in_mat['sch_mat1'] = np.dot(in_mat['sch_invA'], mat1)

return in_mat
— словарь, определенный до вызова функции:

Код: Выделить всё

in_mat = Dict.empty(
key_type=types.unicode_type,
value_type=types.float64[:, :],
)
Изначально функция использовала float64 np.arrays без словаря. После замены массивов словарной структурой я получил предупреждение относительно последнего скалярного произведения:

Код: Выделить всё

np.dot() is faster on contiguous arrays...
Поэтому я сначала исследовал матрицы, участвующие в скалярном произведении (проверяя их флаг C_CONTIGUOUS, как описано здесь). К моему удивлению, оба массива mat1 и in_mat['sch_invA'] действительно были смежными.
Тогда я подумал, что проблема может быть в том, как Numba их читает. массивы. Я нашел интересный пост, в котором предполагается, что может помочь изменение типов в определениях словарей. Таким образом, я изменил определение словаря следующим образом:

Код: Выделить всё

in_mat = Dict.empty(
key_type=types.unicode_type,
value_type=types.float64[:, ::1],
)
С этого момента при выполнении кода я получил ошибку... Я подумал, что допустил ошибку, а затем вернулся к исходному определению моего словаря, а затем код запустился отлично ! Больше никаких предупреждений о несмежных массивах.
Мне удалось воспроизвести проблему неоднократно. Таким образом, кажется, что предупреждение Numba не соответствует действительности... Это заставляет меня задать следующие вопросы:
  • есть ли способ определить Numba словари и заставить их быть C-непрерывными?
  • вы когда-нибудь сталкивались с таким противоречивым предупреждением в Numba?
  • как такое предупреждение может появиться, когда оба массива помечены как C_CONTIGUOUS ?


Подробнее здесь: https://stackoverflow.com/questions/789 ... -and-numba

Вернуться в «Python»