このソリューションは Kieth のfromiter手法を使用しますが、SQL 結果の 2 次元テーブル構造をより直感的に処理します。また、Python データ型のすべての再形成と平坦化を回避することで Doug の方法を改善します。構造化された配列を使用すると、MySQL の結果からほとんど直接 numpy に読み取ることができ、Python のデータ型をほぼ完全に切り取ることができます。「ほぼ」と言ったのは、fetchallイテレーターがまだ Python タプルを生成しているからです。
ただし、注意点が 1 つありますが、大したことではありません。列のデータ型と行数を事前に知っておく必要があります。
おそらくクエリが何であるかを知っているので、列の型を知ることは明らかなはずです。
行数を知るということは、クライアント側のカーソルを使用する必要があることを意味します (これがデフォルトです)。MySQLdb と MySQL クライアント ライブラリの内部については十分に理解していませんが、クライアント側のカーソルを使用すると、結果全体がクライアント側のメモリにフェッチされると理解していますが、実際にはバッファリングとキャッシュが関係していると思われます。これは、カーソルのコピーに 1 回、配列のコピーに 1 回、結果に 2 つのメモリを使用することを意味するため、結果セットが大きい場合は、できるだけ早くカーソルを閉じてメモリを解放することをお勧めします。
厳密に言えば、事前に行数を指定する必要はありませんが、そうすると、配列メモリが事前に一度割り当てられ、巨大なパフォーマンスの向上。
それで、いくつかのコード
import MySQLdb
import numpy
conn = MySQLdb.connect(host='localhost', user='bob', passwd='mypasswd', db='bigdb')
curs = conn.cursor() #Use a client side cursor so you can access curs.rowcount
numrows = curs.execute("SELECT id, rating FROM video")
#curs.fetchall() is the iterator as per Kieth's answer
#count=numrows means advance allocation
#dtype='i4,i4' means two columns, both 4 byte (32 bit) integers
A = numpy.fromiter(curs.fetchall(), count=numrows, dtype=('i4,i4'))
print A #output entire array
ids = A['f0'] #ids = an array of the first column
#(strictly speaking it's a field not column)
ratings = A['f1'] #ratings is an array of the second colum
列のデータ型と列名を指定する方法については、dtype の numpy ドキュメントと構造化配列に関する上記のリンクを参照してください。