Почему я продолжаю получать эту ошибку «RuntimeWarning: переполнение, обнаруженное в int_scalars» - PullRequest
0 голосов
/ 10 ноября 2018

Я пытаюсь умножить все значения строк и значений столбцов двумерного массива numpy на явный цикл for :

product_0 = 1
product_1 = 1
for x in arr:
   product_0 *= x[0]
   product_1 *= x[1]

Я понимаю, что продукт взорветсячтобы стать чрезвычайно большим числом, но из моего предыдущего опыта у питона не было проблем с памятью, имеющих дело с очень очень большими числами.
Итак, из того, что я могу сказать, это проблема с numpy, за исключением того, что я не храню гигантский продукт в массиве numpy или любом типе данных numpy в этом отношении, это просто обычная переменная python.

Есть идеи, как это исправить?

Использование неумножения не помогло product_0 = x[0]*product_0

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Numpy скомпилирован для 32-битной, а не 64-битной версии, поэтому, хотя Python и справится с этой, numpy будет переполнен при меньших значениях, если вы захотите использовать numpy, я рекомендую вам собрать его из исходного кода.

Редактировать После некоторого тестирования с

import numpy as np
x=np.abs(np.random.randn(1000,2)*1000)
np.max(x)
prod1=np.dtype('int32').type(1)
prod2=np.dtype('int32').type(1)
k=0
for i,j in x:
    prod1*=i
    prod2*=j
    k+=1
    print(k," ",prod1,prod2)

1.797693134e308 is the max value (to this many digits my numpy scalar was able to take)

если вы запустите это, вы увидите, что numpy может обрабатывать довольно большое значение, но когда вы сказали, что ваше максимальное значение составляет около 700, даже при значениях 1000 мой скаляр переполнен.

Что касается того, как это исправить, то вместо того, чтобы делать это вручную, ответ с использованием scipy теперь кажется более жизнеспособным и может получить ответ, поэтому я предлагаю вам продолжить с этим

from scipy.stats.mstats import gmean
x=np.abs(np.random.randn(1000,2)*1000)
print(gmean(x,axis=0))
0 голосов
/ 10 ноября 2018

Вы говорите

Итак, из того, что я могу сказать, это проблема с numpy, за исключением того, что я не храню гигантский продукт в массиве numpy или в каком-либо другом типе данных numpy в этом отношении, это просто обычная переменная python.

Ваш продукт не может быть массивом NumPy, но равен с использованием типа данных NumPy. x[0] и x[1] являются скалярами NumPy, а умножение Python int на скаляр NumPy дает скаляр NumPy. Целые числа NumPy имеют конечный диапазон.

Хотя технически вы могли бы вызывать int на x[0] и x[1], чтобы получить Python int, вероятно, было бы лучше избегать таких огромных целых чисел. Вы говорите, что пытаетесь выполнить это умножение для вычисления среднего геометрического; в этом случае было бы лучше вычислить среднее геометрическое путем преобразования в логарифмы и обратно или использовать scipy.stats.mstats.gmean, который использует логарифмы под капотом.

0 голосов
/ 10 ноября 2018

Python int представлены в с произвольной точностью , поэтому они не могут переполниться . Но numpy использует C ++ под капотом, поэтому самое большое длинное целое число со знаком имеет фиксированную точность, 2^63 - 1. Ваш номер намного превышает это значение, имея в среднем ((716-1)/2)^86507).

Когда вы в цикле for извлекаете x[0], это все еще объект numpy. Чтобы использовать всю мощь целых чисел python, вам необходимо четко назначить его как python int, например:

product_0 = 1
product_1 = 1
for x in arr:
    t = int(x[0])
    product_0 = product_0 * t

и не переполнится .

После вашего комментария, который делает ваш вопрос более конкретным, ваша первоначальная задача состоит в том, чтобы вычислить среднее геометрическое массива для каждой строки / столбца. Вот решение:

Сначала я генерирую массив, который имеет те же свойства, что и ваш массив:

arr = np.resize(np.random.randint(1,716,86507*2 ),(86507,2))

Затем вычислите среднее геометрическое значение для каждого столбца / строки:

from scipy import stats

gm_0 = stats.mstats.gmean(arr, axis = 0)
gm_1 = stats.mstats.gmean(arr, axis = 1) 

gm_0 будет массивом, который содержит среднее геометрическое x и y координат. gm_1 вместо этого содержит среднее геометрическое число строк.

Надеюсь, это решит вашу проблему!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...