我有一组数据,它有三个维度X,Y,Z顺序为24,67,95, 和8个变量:a,b,c,d ,e,f,g,h最快的方法来组合和归一化来自多维多维数组的数据
每个变量存储在[X,Y,Z] numpy数组()中,即24 * 67 * 95 = 152760的值。
将数组组合成一个OrderedDict(),其中的键是变量的名称。
所以,变量a为尺寸x的值,Y,Z是由数据给出[ '一'] [X] [Y] [Z]
欲这个数据插入到一个MySQL表中的归一化格式,它是由X,Y索引,Z:
---------------------
|x|y|z|a|b|c|d|e|f|g|h|
---------------------
| | | | | | | | | | | |
我以下面的方式,其中在x的每个步骤产生67 * 95 = 6365条目的插入语句这样做,我知道这是MySQL的最佳数量级:
cur = db.cursor()
Xs = 24
Ys = 67
Zs = 95
variables = ['a','b','c','d','e','f','g','h']
for x in range(Xs):
sql="insert into mytable (X,Y,Z"
for variable in variables:
sql+=","+variable
sql+=") values"
for y in range(Ys):
for z in range(Zs):
sql+="(%d,%d,%d" % (x,y,z)
for variable in variables:
sql+=","+str(data[variable][x][y][z])
sql+="),"
cur.execute(sql[:-1])
整个循环在我的四核PC上每次迭代运行需要大约24秒的时间,只需要执行插入语句的约0.5秒。
有没有更快的方法来组合和规范化这些变量在内存中? (我知道标准化的数据库可能不是这种多维数据的最佳存储格式,这是我随后将测试的 - 对于这个问题的目的,假设它是)
谢谢!
尝试使用生成的浮动代码生成一个长字符串与SQL命令 - 它只需要不到2.5秒在我的笔记本电脑上。如果我理解你的帖子,你有24 * 67 * 95 * 8的数字。别的东西似乎在吃掉你的时间。 – Dietrich
两个小建议:(1)Numpy数组被索引为'array [x,y,z]',但是你使用了'array [x] [y] [z]'。 (2)将SQL命令的各个部分收集到一个列表中,并在最后执行一个'str.join',以避免每次分配一个越来越长的字符串(你不能真正追加到Python中的字符串,因为它们是不可变的)。 – 2014-02-18 23:53:28
也许更好,在数组上调用'tolist()'方法并为嵌套列表建立索引,因为它比索引一个numpy数组更快。 – 2014-02-19 00:04:06