4

浮動小数点数を含む Numpy 配列を sqlite3 に保存できますが、整数を含む配列は保存できません。

import sqlite3
import numpy as np

db = sqlite3.connect('database.db')
database = db.cursor()

database.execute("CREATE TABLE table_name " 
     "(round INT, id INT, PRIMARY   KEY(round, id))")

row_to_write = np.array([1])
dtype = str(row_to_write.dtype)
if dtype.startswith('float'):
    database.execute("ALTER TABLE table_name ADD data FLOAT;")
elif dtype.startswith('int'):
    database.execute("ALTER TABLE table_name ADD data INTEGER;")

insert_str = "INSERT INTO table_name (round, id, data) VALUES (0, 0, ?);"
database.execute(insert_str, row_to_write)

結果:

InterfaceError: Error binding parameter 0 - probably unsupported type.

代わりに浮動小数点配列を割り当てると機能します row_to_write = np.array([1.1])

4

2 に答える 2

8

Numpy は、いくつかのカスタム整数データ型を使用して、データをメモリに効率的にパックします。これらの型は sqlite にはなじみがないため、事前にそれらの処理方法を伝える必要があります。

>>> for t in (np.int8, np.int16, np.int32, np.int64,
...           np.uint8, np.uint16, np.uint32, np.uint64):
...     sqlite3.register_adapter(t, long)
... 
>>> cur.execute("insert into foo(bar) values(?)", np.array([1]))
<sqlite3.Cursor object at 0x027A7620>
于 2012-08-11T02:34:47.583 に答える
0

tolist値を使用する前に、配列を呼び出すことができます。

>>> import numpy as np
>>> x = np.array([1,2,3])
>>> type(x[0])
<type 'numpy.int64'>
>>> y = x.tolist()
>>> y
[1, 2, 3]
>>> type(y[0])
<type 'int'>
于 2012-08-11T02:49:06.027 に答える