2015-07-16 3 views
0

я в настоящее время реализовать 2D сюжет, который должен использоваться связать эти два значения визуальной «пейзаж»:Обработка больших длинных значений в Matplotlib

  • оси х: огромные двоичные дискретные значения с длиной до до 3000 знаков (2^3000)
  • у оси: вычисленное значение (без проблем)

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

import numpy as np 
import matplotlib.pyplot as plt 

''' 
convert binary list to gray code to maintain hamming distance 
''' 
def indtogray(self, ind): 
    return ind[:1] + [i^ishift for i, ishift in zip(ind[:-1], ind[1:])] 

''' 
Create int from gray value 
''' 
def graytoint(self, gray): 
    i = 0 
    for bit in gray: 
     i = i*2 + bit 
    return i 

''' 
Create example list of binary lists 
''' 
def create(self, n, size): 
    return [[np.random.randint(2) for _ in range(size)] for _ in range(n)] 

def showPlot(self, toolbox, neval): 
    individuals = self.create(100, 2000) 
    fitnesses = map(np.sum, individuals) 

    fig,ax = plt.subplots() 
    values = map(self.graytoint, map(self.indtogray, individuals)) 
    full = zip(*sorted(zip(values, fitnesses))) 
    line = ax.plot(full[0], full[1], 'r-') 
    plt.show() 

if __name__ == '__main__': 
    show() 

Я получаю следующее сообщение об ошибке:

OverflowError: long int too large to convert to float 

Кто-нибудь идея?

ответ

0

Ошибка просто означает, что ваш номер слишком большой и он не может преобразовать его в float. Вещи, которые вы можете сделать, это взять логарифм x.

Теперь, если у вас есть до 3000 двоичных цифр, это означает, что наибольшее десятичное число составляет pow(2,3000). Если вы берете log(pow(2,3000), вы должны получить 2079.44154 ~, который затем должен быть способен конвертировать в поплавок. Я бы дважды проверял, есть ли номер, который у вас есть, в двоичном формате, но в десятичном представлении. Значение, если x[0] = 10, убедитесь, что оно равно десяти, а не 2 в двоичном формате. В противном случае номер 2^3000 в двоичном формате был бы очень большим.

+0

Интересно, что numpy также не может обрабатывать большие числа: np.log10 (pow (2,2000)) -> AttributeError: у объекта long нет атрибута 'log10', тогда как математика pythons может это сделать , – Robin

Смежные вопросы