Ошибка Python «объект с плавающей точкой не может интерпретироваться как индекс» в среде Canopy - PullRequest
0 голосов
/ 08 июня 2018

Я использую версию Canopy 2.1.9.3717 для запуска кода, написанного кем-то другим, при построении гистограммы для начального анализа предыдущего ряда данных, и я каждый раз сталкиваюсь с этой ошибкой.Я попробовал все переустановить numpy или изменить известные числовые переменные на int вместо float, ничего не получилось.Я действительно новичок в программировании, и это привело меня в замешательство.Вот код:


from __future__ import division 
import numpy as np
import matplotlib as mpl
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import pylab
import lmfit
import math
import random
from scipy.optimize import curve_fit
from scipy.optimize import leastsq
from scipy.stats import gamma
import csv
import ntpath
import pandas as pd

end = 0
bslist = []

path = '/Users/....../'

proj_name = '180607'

data_input = '180607_BootstrapGlobal.csv'

bs_param_CIs=pd.DataFrame()

#Extract data supplied as a .csv file
fn = ntpath.basename(path) 
datafile = fn.split(".")[0]
datafile2 = path+data_input
bootstrap=pd.read_csv(datafile2, sep=None, header=0,engine= 'python')


def ctend_plot(point, ci, y, label):                          #function to define central tendency and error bars
        plt.plot(ci,[y,y],"-", color="g", linewidth=4, label=label)
        plt.plot(point, y, "o", color="r", markersize=10)


for column in bootstrap: 
    fig = plt.figure()
    ax = fig.add_subplot(111)      
    bsmean = np.mean(bootstrap[column])
    bsstd = np.std(bootstrap[column])
    bsmed= np.median(bootstrap[column])                  # HERE WE ARE USING THE MEDIAN TO CALC CI
    plt.hist(bootstrap[column],bins=math.ceil(np.sqrt(len(bootstrap[column]))))
    bsmean_y = 10
    lower=2.5                                           #CHANGE lower and upper TO CALC SOMETHING OTHER THAN 95% CI!
    upper=97.5
    percCI= int(upper-lower)
    bsiqr= np.percentile(bootstrap[column],[lower,upper])
    ctend_plot(bsmed,bsiqr,bsmean_y-8, "%s %i CI" %(column, percCI)) 
    plt.legend();
    lgd = ax.legend(bbox_to_anchor=(1.05,1.05), loc=5, borderaxespad=0)
    plt.savefig('{0}{1}_{2}%CI_{3}.png'.format(path, proj_name,percCI,column), dpi=300)
    plt.clf()
    plt.close()
    bs_param_CI_one=pd.DataFrame({ 'Param' : ['%s'%(column)],
                                    'Mean': ['%f'%(bsmean)],
                                    'Median': ['%f'%(bsmed)],
                                    '%s_CI'%(percCI): ['%s'%(bsiqr)] })
    bs_param_CI_one=bs_param_CI_one[['Param','Mean','Median','%s_CI'%(percCI)]]
    frames =[bs_param_CIs, bs_param_CI_one]
    bs_param_CIs=pd.concat(frames)

bs_param_CIs.to_csv("{0}{1}_bootstrap_CIs.csv".format(path, proj_name),index=None)  

И вывод:

TypeErrorTraceback (most recent call last)
/Users/.../bootstrap_figs.py in <module>()
     44     bsstd = np.std(bootstrap[column])
     45     bsmed= np.median(bootstrap[column])                  # HERE WE ARE USING THE MEDIAN TO CALC CI
---> 46     plt.hist(bootstrap[column],bins=math.ceil(np.sqrt(len(bootstrap[column]))))
     47     bsmean_y = 10
     48     lower=2                                         #CHANGE lower and upper TO CALC SOMETHING OTHER THAN 95% CI!
/Users/yasmin_m/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/matplotlib/pyplot.pyc in hist(x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, hold, data, **kwargs)
   3080                       histtype=histtype, align=align, orientation=orientation,
   3081                       rwidth=rwidth, log=log, color=color, label=label,
-> 3082                       stacked=stacked, data=data, **kwargs)
   3083     finally:
   3084         ax._hold = washold
/Users/yasmin_m/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/matplotlib/__init__.pyc in inner(ax, *args, **kwargs)
   1890                     warnings.warn(msg % (label_namer, func.__name__),
   1891                                   RuntimeWarning, stacklevel=2)
-> 1892             return func(ax, *args, **kwargs)
   1893         pre_doc = inner.__doc__
   1894         if pre_doc is None:
/Users/yasmin_m/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/matplotlib/axes/_axes.pyc in hist(self, x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs)
   6190             # this will automatically overwrite bins,
   6191             # so that each histogram uses the same bins
-> 6192             m, bins = np.histogram(x[i], bins, weights=w[i], **hist_kwargs)
   6193             m = m.astype(float)  # causes problems later if it's an int
   6194             if mlast is None:
/Users/yasmin_m/Library/Enthought/Canopy/edm/envs/User/lib/python2.7/site-packages/numpy/lib/function_base.py in histogram(a, bins, range, normed, weights, density)
    727 
    728         # Initialize empty histogram
--> 729         n = np.zeros(bins, ntype)
    730         # Pre-compute histogram scaling factor
    731         norm = bins / (mx - mn)
TypeError: 'float' object cannot be interpreted as an index

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Вы говорите:

Я попробовал все переустановить numpy или заменить известные числовые переменные на int вместо float

… но вы, похоже, на самом деле непреобразование в int, просто вызывая math.ceil на них.Это не меняет тип:

Возвращает верхний предел x в виде числа с плавающей запятой , наименьшее целочисленное значение, большее или равное x.

Вероятно, вам понадобится int(math.ceil(…)), который получает потолок как float, а затем преобразует это int в float (урезая его, но, так как вы уже перекрыли его, это будет хорошо), который затем можно использовать в качестве индекса.


Если заимствованный вами код был написан для Python 3, версия Python 3 math.ceil возвращает int. 1,2 Так что это работало в Python 3, но ваш бэкпорт в Python 2 - нет.

(В связи с этим возникает вопрос о том, почему вы копируете код в Python 2, а не простоиспользуя Python 3, но ... возможно, у вас есть причина для этого.)


1.На самом деле, он возвращает int только при вызове на float.При вызове какого-либо другого типа он гарантированно возвращает что-то, что соответствует Integral, но это не обязательно означает, что его можно использовать как индекс.Но это редко будет проблемой, и ее здесь нет.

2.Python 2 был разработан для того, чтобы возвращать типы, ожидаемые экспертом C;Python 3 был разработан для возврата всего, что сбивает с толку или наиболее полезного.Самый известный пример: 5/2 - 2 в 2.x, 2.5 в 3.x.

0 голосов
/ 08 июня 2018

Вы получаете эту ошибку, потому что вам нужно передать int, а не float.Функция ciel возвращает число с плавающей запятой.Вы можете ввести его целым числом.

...