Numpy Проблема с массивом при вычислении, тип int, int32 и int64 - PullRequest
0 голосов
/ 13 февраля 2020

Я не знаю, почему существует расхождение между двумя строками кода ниже. Массив Numpy (т. Е. "Load_values") по какой-то причине немного отключен в расчете? Когда я заменяю индекс массива Numpy фактическим значением, которое хранится (в данном случае, 1800), я получаю правильный ответ. Кроме того, я заменил массив Numpy обычным списком, и он также получил правильный ответ. Только когда я использую массив Numpy, я немного искажаю вычисления. Любая причина, почему это было бы так? Это очевидно, и я просто не вижу этого?

In [27]: alpha[3] + alpha[2] * 1800 + alpha[1] * (1800 ** 2) + alpha[0] * (1800 ** 3)

Out[27]: 1.2057057142857146

In [28]: alpha[3] + alpha[2] * load_values[2] + alpha[1] * (load_values[2] ** 2) + alpha[0] * (load_values[2] ** 3)

Out [28]: 1.2048772097918872

Редактировать: Вот альфа и load_values:

In[54]: alpha

Out[54]: array([ 4.24382716e-13, -1.18055556e-09, -6.69194444e-04,  1.64000000e-03])

In[55]: load_values

Out[55]: array([ 600, 1200, 1800, 2400, 3000])

1 Ответ

2 голосов
/ 14 февраля 2020

Как упоминалось в комментариях, root проблемы является переполнением при выполнении операции: load_values[2] ** 3. Тип int по умолчанию для numpy выглядит как int32, тогда как стандарт python int выглядит как минимум эквивалент numpy.int64. Вам нужно использовать int64, чтобы правильно вычислить ваше уравнение. Это можно увидеть здесь:

# load_values as int32 array (numpy default):
print(type(load_values[2]))  # <class 'numpy.int32'>
print(type(1800))            # <class 'int'>

answer_1 = 1800 ** 3
answer_2 = load_values[2] ** 3

print(answer_1)              # 5832000000
print(answer_2)              # 1537032704


# load_values as int64 array:
load_values = np.array(load_values, dtype=np.int64)

print(type(load_values[2]))  # <class 'numpy.int64'>
print(type(1800))            # <class 'int'>

answer_1 = 1800 ** 3
answer_2 = load_values[2] ** 3

print(answer_1)              # 5832000000
print(answer_2)              # 5832000000

Я оставлю вам побитовый анализ за вами.

...