2013-09-02 2 views
3

Так что я пытался следовать What's the most efficient way to convert a MySQL result set to a NumPy array?, но у меня все еще есть проблемы.MySQLdb-запрос к массиву Numpy

Мои строки базы данных состоят из 57 целых чисел без знака (Unix-эпоха плюс количество байтов для каждого из 28 портов коммутатора, вход и выход).

Мой код выглядит следующим образом:

import MySQLdb as mdb 
import numpy 

# get the database connector 
DBconn = mdb.connect('localhost', 'root', '<Password>', 'Monitoring') 

with DBconn: 

    # prepare a cursor object using cursor() method 
    cursor = DBconn.cursor() 

    # now get the data for the last 10 minutes 
    sql = "select * from LowerSwitchBytes where ComputerTime >= (unix_timestamp(now())-(60*10))" 
    cursor.execute(sql) 

    results = cursor.fetchall() 
    for row in results: 
     print row 

Так что выводит 10 строк, как:

(1378151928L, 615983307L, 517980853L, 25355784L, 117110102L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 267680651L, 288368872L, 84761960L, 337403085L, 224270992L, 335381466L, 27238950843L, 549910918625L, 240002569249L, 11167210734L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 222575491L, 335850213L, 223669465L, 339800088L, 310004136202L, 16635727254L, 0L, 0L, 16590672L, 147102083L, 0L, 0L, 0L, 0L) 

Но когда я изменить:

results = cursor.fetchall() 
    for row in results: 
     print row 

в

A = numpy.fromiter(cursor.fetchall(), count=-1, dtype=numpy.uint32) 
    print A 

я получаю:

Traceback (most recent call last): 
    File "min.py", line 23, in <module> 
    A = numpy.fromiter(cursor.fetchall(), count=-1, dtype=numpy.uint32) 
ValueError: setting an array element with a sequence. 

Любая идея, что я делаю неправильно?

ответ

2

np.fromiter жалуется, потому что он пытается написать полный ряд входов в один элемент нового массива. Вы можете работать вокруг этого, используя рекордными массивы:

A = numpy.fromiter(cursor.fetchall(), count=-1, 
        dtype=[('', numpy.uint8)]*57) 

Если все ваши записи одного и того же типа, вы можете получить представление массива следующим образом:

A = A.view(numpy.uint8).reshape(-1, 57) 
+0

Так что в основном работает, но так как они это bigint номера, это numpy.uint32 вместо numpy.uint8 на обеих линиях. Большое спасибо! – wpns

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