在列表中保存值(Numpy)

-1 投票
2 回答
1145 浏览
提问于 2025-04-18 12:12

我有一个包含多个列表的列表,这些列表里有一些值,我想把它们保存起来,以便以后使用。把它们保存到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))) )

不过我得提一下,我这个是比较快拼凑出来的。其实应该还有更好的写法,只是我现在想不起来了。

撰写回答