Я пытаюсь построить ящик для столбца в нескольких файлах csv (без строки заголовка, конечно), но запутывает некоторую путаницу вокруг кортежей, списков и массивов. Вот что я до сих пор
#!/usr/bin/env python
import csv
from numpy import *
import pylab as p
import matplotlib
#open one file, until boxplot-ing works
f = csv.reader (open('2-node.csv'))
#get all the columns in the file
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,bytes,Latency = zip(*f)
#Make list out of elapsed to pop the 1st element -- the header
elapsed_list = list(elapsed)
elapsed_list.pop(0)
#Turn list back to a tuple
elapsed = tuple(elapsed_list)
#Turn list to an numpy array
elapsed_array = array(elapsed_list)
#Elapsed Column statically entered into an array
data_array = ([4631, 3641, 1902, 1937, 1745, 8937] )
print data_array #prints in this format: ([xx,xx,xx,xx]), .__class__ is list ... ?
print elapsed #prints in this format: ('xx','xx','xx','xx'), .__class__ is tuple
print elapsed_list # #print in this format: ['xx', 'xx', 'xx', 'xx', 'xx'], .__class__ is list
print elapsed_array #prints in this format: ['xx' 'xx' 'xx' 'xx' 'xx'] -- notice no commas, .__class__ is numpy.ndarray
p.boxplot (data_array) #works
p.boxplot (elapsed) # does not work, error below
p.boxplit (elapsed_list) #does not work
p.boxplot (elapsed_array) #does not work
p.show()
Для boxplots первый аргумент - это " массив или последовательность векторов ", поэтому я думаю, что elapsed_array
будет работать...? Но все же data_array
, "список", работает... но elapsed_list "список" не...? Есть лучший способ сделать это...?
Я новичок в python, и я хотел бы понять, что относительно различий между кортежем, списком и numpy-массивом, препятствует работе этого boxplot.
Пример сообщения об ошибке:
Traceback (most recent call last):
File "../pullcol.py", line 32, in <module>
p.boxplot (elapsed_list)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/pyplot.py", line 1962, in boxplot
ret = ax.boxplot(x, notch, sym, vert, whis, positions, widths, patch_artist, bootstrap)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes.py", line 5383, in boxplot
q1, med, q3 = mlab.prctile(d,[25,50,75])
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/mlab.py", line 946, in prctile
return _interpolate(values[ai],values[bi],frac)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/mlab.py", line 920, in _interpolate
return a + (b - a)*fraction
TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray'
elapsed
содержит строки. Matplotlib нуждается в целых числах или плаваниях, чтобы что-то нарисовать. Попробуйте преобразовать каждое значение, elapsed
с целым числом. Вы можете сделать это так
elapsed = tuple([int(i) for i in elapsed])
или как FredL прокомментировал ниже:
elapsed_list = array(elapsed_list, dtype=float)
Я не знаком с numpy или matplotlib, но только из описания и того, что работает, похоже, он ищет вложенную последовательность последовательностей. Именно поэтому data_array работает как кортеж, содержащий список, где, поскольку весь ваш другой вход имеет только один уровень глубины.
Что касается различий, список - это изменяемая последовательность объектов, кортеж - неизменяемая последовательность объектов, а массив - изменяемая последовательность байтов, ints, символов (в основном, 1, 2, 4 или 8 байтов).
Здесь ссылка на документы Python около 5.6. Типы последовательностей, оттуда вы можете перейти к более подробной информации о списках, кортежах, массивах или любых других типах последовательностей в Python.
'xx'
который является строкой ...? Все они выглядят как цифры (-: