Кортежи против списка против массивов Numpy для построения бокса в Python - PullRequest
1 голос
/ 31 августа 2011

Я пытаюсь построить блокпост для столбца в нескольких 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()

Для коробочных диаграмм 1-й аргумент - это " массив или последовательность векторов ", поэтому я думаю, что 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'

Ответы [ 2 ]

4 голосов
/ 31 августа 2011

elapsed содержит строки. Matplotlib нужны целые числа или числа с плавающей точкой для построения чего-либо. Попробуйте преобразовать каждое значение elapsed в целое число. Вы можете сделать это так

elapsed = tuple([int(i) for i in elapsed])

или как прокомментировал FredL ниже:

elapsed_list = array(elapsed_list, dtype=float)
1 голос
/ 31 августа 2011

Я не знаком с numpy или matplotlib, но только из описания и того, что работает, похоже, он ищет вложенную последовательность последовательностей. Вот почему data_array работает как кортеж со списком, где все остальные входные данные имеют только один слой.

Что касается различий, список - это изменяемая последовательность объектов, кортеж - это неизменяемая последовательность объектов, а массив - изменяемая последовательность байтов, целых чисел, символов (в основном значения 1, 2, 4 или 8 байтов). .

Вот ссылка на документы Python о 5.6. Типы последовательностей , оттуда вы можете перейти к более подробной информации о списках, кортежах, массивах или любых других типах последовательностей в Python.

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