Ошибка типа: объект ‘float’ не поддается подписке при попытке создать гистограмму в matplotlib

#python #matplotlib #histogram

#python #matplotlib #гистограмма

Вопрос:

Когда я пытаюсь запустить следующий код

 import matplotlib.pyplot as plt
import math
import numpy as np
from numpy.random import normal

masses = []

f = open( 'myfile.txt','r')
f.readline()
for line in f:
   if line != ' ':      
   line = line.strip()    # Strips end of line character 

   columns = line.split() # Splits into coloumn 
   mass = columns[8]      # Column which contains mass values
   mass = float(mass)
   masses.append(mass)
   mass = math.log10(mass)
   #print(mass)


#gaussian_numbers = #normal(size=1000)
plt.hist(mass, bins = 50, normed = True)
plt.title("Gaussian Histogram")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.show()
  

Я получаю эту ошибку

 Traceback (most recent call last):
  File "C:Documents and SettingsKharyMy DocumentsPythonHALOMASS_READER_PLOTTER.py",  line 23, in <module>
plt.hist(mass, bins = 50, normed = True)
  File "C:Python32libsite-packagesmatplotlibpyplot.py", line 2191, in hist
ret = ax.hist(x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, **kwargs)
File "C:Python32libsite-packagesmatplotlibaxes.py", line 7606, in hist
if isinstance(x, np.ndarray) or not iterable(x[0]):
TypeError: 'float' object is not subscriptable 
  

Можно ли не использовать значения с плавающей точкой при создании гистограмм или я что-то еще упускаю? Будем признательны за любую помощь.

Комментарии:

1. У меня есть еще один вопрос. Как я могу получить среднее значение величин в ячейке? Спасибо!

Ответ №1:

Основываясь на документах, я почти уверен mass , что ему не место в hist() вызове…

Комментарии:

1. @Surfcast23, вы должны предоставить hist() со списком mass, который является masses , а не mass . Matplotlib попытался разбить массу на элементы, но это не удалось, поскольку это одноэлементный float, поэтому вы получаете ошибку «unscriptable».

2. На самом деле для этого требуется двумерная структура, либо неровная последовательность, либо 2D-массив NumPy.

Ответ №2:

@Ignacio поставил правильный диагноз: вы предоставили неправильную переменную для вызова hist(). Вы перепутали одноэлементную плавающую переменную mass с переменной списка, содержащей несколько плавающих масс. для hist() требуется список или любой итерируемый контейнер Python. Ваш код может быть улучшен путем удаления некоторых ненужных элементов и предотвращения путаницы. В качестве общего совета, опасно использовать имя переменной, когда также используются формы с множественным числом / прошедшим напряжением.

 import matplotlib.pyplot as plt

mass_list = []

with open('myfile.txt', 'r') as f:
    data = [line.strip().split() for line in f.readlines()]
    mass_list.extend([float(row[8]) for row in data if row[0] != ''])

plt.hist(mass_list, bins=50, normed=True)
...
  

Комментарии:

1. Спасибо за разъяснение. Как получить логарифм значений, которые у меня есть, используя ваш метод?

2.Вы имеете в виду журнал каждой массы? <br/> from math import log10 mass_list.extend([log10(float(row[8])) for row in data if row[0] != ''])

3. @ Shimofuri да, каждая масса. Кроме того, данные в моем исходном файле представляют собой столбец, могу ли я просто изменить строку на столбец в вашем скрипте? Еще раз спасибо

4. @surfcast23, вы можете изменить строку на любое другое имя… однако это было бы осмысленно, поскольку данные содержат строки, а доступ к столбцам фактически осуществляется с помощью [index]. То, что я там использовал, называется «понимание списка».

5. о, я думал, что когда вы используете «строку» или «столбец», считывается либо «строка», либо «столбец» в наборе данных. спасибо за разъяснение. Также, чтобы узнать немного больше об этом, как я мог бы изменить свой существующий скрипт, чтобы делать то, что делает ваш? Это просто вопрос переназначения имен переменных?