numpy的阵列中使用SQLite [英] NumPy arrays with SQLite
问题描述
我在Python中最常见的SQLite的接口是的sqlite3
,但有什么与numpy的数组或recarrays效果很好?我的意思是一个可识别的数据类型,并不需要按行插入一行,并提取到一个numpy的(REC)阵列...?有点像在 RDB
或 sqldf
库,如果有人熟悉这些(他们进口/出口研究的SQL函数/整个表或表的子集追加到或者从R数据表)。
The most common SQLite interface I've seen in Python is sqlite3
, but is there anything that works well with NumPy arrays or recarrays? By that I mean one that recognizes data types and does not require inserting row by row, and extracts into a NumPy (rec)array...? Kind of like R's SQL functions in the RDB
or sqldf
libraries, if anyone is familiar with those (they import/export/append whole tables or subsets of tables to or from R data tables).
推荐答案
为什么不给的 Redis的 的一试?
为您所关注两个平台的驱动程序可以 - 蟒蛇( Redis的的,通过包索引] 2 一>)和R( rredis 的, CRAN )。
Drivers for your two platforms of interest are available--python (redis, via package index]2), and R (rredis, CRAN).
Redis的的天才之处的不的,它会神奇地认识到numpy的数据类型和允许你插入和好像他们是本地Redis的数据类型,而它的天才在于提取多维numpy的阵列卓越的易用性,使用它可以创建这样一个接口与code的只有几行。
The genius of redis is not that it will magically recognize the NumPy data type and allow you to insert and extract multi-dimensional NumPy arrays as if they were native redis datatypes, rather its genius is in the remarkable ease with which you can create such an interface with just a few lines of code.
有(至少)对蟒蛇Redis的几个教程;在 DeGizmo博客中的一个是特别好。
There are (at least) several tutorials on redis in python; the one on the DeGizmo blog is particularly good.
import numpy as NP
# create some data
A = NP.random.randint(0, 10, 40).reshape(8, 5)
# a couple of utility functions to (i) manipulate NumPy arrays prior to insertion
# into redis db for more compact storage &
# (ii) to restore the original NumPy data types upon retrieval from redis db
fnx2 = lambda v : map(int, list(v))
fnx = lambda v : ''.join(map(str, v))
# start the redis server (e.g. from a bash prompt)
$> cd /usr/local/bin # default install directory for 'nix
$> redis-server # starts the redis server
# start the redis client:
from redis import Redis
r0 = Redis(db=0, port=6379, host='localhost') # same as: r0 = Redis()
# to insert items using redis 'string' datatype, call 'set' on the database, r0, and
# just pass in a key, and the item to insert
r0.set('k1', A[0,:])
# row-wise insertion the 2D array into redis, iterate over the array:
for c in range(A.shape[0]):
r0.set( "k{0}".format(c), fnx(A[c,:]) )
# or to insert all rows at once
# use 'mset' ('multi set') and pass in a key-value mapping:
x = dict([sublist for sublist in enumerate(A.tolist())])
r0.mset(x1)
# to retrieve a row, pass its key to 'get'
>>> r0.get('k0')
'63295'
# retrieve the entire array from redis:
kx = r0.keys('*') # returns all keys in redis database, r0
for key in kx :
r0.get(key)
# to retrieve it in original form:
A = []
for key in kx:
A.append(fnx2(r0.get("{0}".format(key))))
>>> A = NP.array(A)
>>> A
array([[ 6., 2., 3., 3., 9.],
[ 4., 9., 6., 2., 3.],
[ 3., 7., 9., 5., 0.],
[ 5., 2., 6., 3., 4.],
[ 7., 1., 5., 0., 2.],
[ 8., 6., 1., 5., 8.],
[ 1., 7., 6., 4., 9.],
[ 6., 4., 1., 3., 6.]])
这篇关于numpy的阵列中使用SQLite的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!