在列表中保存值(Numpy)
我有一个包含多个列表的列表,这些列表里有一些值,我想把它们保存起来,以便以后使用。把它们保存到CSV文件里感觉有点麻烦,所以我想先把这个列表转换成一个数组。
这些列表的名字叫做'modes'。每个'modes'里的条目都包含一组值,表示该模式的共振状态。第一个坐标是实部,第二个是虚部。
# The resonant states of the mode m = 1
In [178]: modes[1]
Out[178]:
{0: array([ 1.12059699, -0.24524525]),
1: array([ 2.71832424, -0.26526527]),
2: array([ 4.28671194, -0.26526527]),
3: array([ 5.87902919, -0.26526527]),
4: array([ 7.44744745, -0.27266801]),
5: array([ 9.02645242, -0.26526527]),
6: array([ 10.61500625, -0.28528529])}
大约有100个模式,每个模式包含50个坐标。我想把这些点转移到一个数组里,格式是(模式,实部,虚部)。比如,上面的部分可以表示为:
array ([[ 1, 1.12059699, -0.24524525],
[ 1, 2.71832424, -0.26526527],
[ 1, 4.28671194, -0.26526527],
etc....
这个数组会包含所有模式的所有共振状态。然后我会把这个数组存储到一个CSV文件里。有人能帮我吗?如果这样做不太好,我也愿意听听其他的建议。
2 个回答
1
CSV格式的数据处理起来比较麻烦,尤其是当里面有嵌套的数据时。如果你还用到了numpy和Python本身的数据结构,那就更复杂了。
如果你需要读写CSV文件,就得自己写一些逻辑来处理。因为numpy的savetxt
方法不支持你在例子中提到的那种包含numpy数组的Python字典。
不过,Python的pickle模块可以处理原生数据、numpy数据以及嵌套的数据:
m={0:{
0: np.array([ 1.12059699, -0.24524525]),
1: np.array([ 2.71832424, -0.26526527]),
2: np.array([ 4.28671194, -0.26526527])},
1:{
3: np.array([ 5.87902919, -0.26526527]),
4: np.array([ 7.44744745, -0.27266801]),
5: np.array([ 9.02645242, -0.26526527]),
6: np.array([ 10.61500625, -0.28528529])}
}
有了这样的数据结构,你可以把它保存为一个pickle文件,方法如下:
with open(fn, 'w') as fout:
fout.write(pickle.dumps(m))
然后你可以把它读回来:
with open(fn) as fin:
mr=pickle.loads(fin.read())
print mr
打印出来的结果是:
{0: {0: array([ 1.12059699, -0.24524525]), 1: array([ 2.71832424, -0.26526527]), 2: array([ 4.28671194, -0.26526527])}, 1: {3: array([ 5.87902919, -0.26526527]), 4: array([ 7.44744745, -0.27266801]), 5: array([ 9.02645242, -0.26526527]), 6: array([ 10.61500625, -0.28528529])}}
1
像这样应该可以工作:
import numpy as np
temp = np.array(modes[0].values())
result = np.hstack( (np.zeros((temp.shape[0], 1)), temp) )
for i in range(1, len(modes)):
temp = np.array(modes[i].values())
result = np.vstack( (result, np.hstack((i * np.ones((temp.shape[0], 1)), temp))) )
不过我得提一下,我这个是比较快拼凑出来的。其实应该还有更好的写法,只是我现在想不起来了。