求教, Python 如何把一个二维 list 存入文件,再读成原来的模样?

2016-03-04 21:27:53 +08:00
 yanyuechuixue

楼主不是专业程序员,请见谅。。。

楼主在做科学计算,要把每个“类星体”的一些数据做一些计算,然后按照计算结果把这些类星体分类(分成 8 * 8 的 64 类),我想到的办法是建立了一个二维 list ( 8 * 8 )的,然后计算东西,计算完成后根据其结果把(类星体文件名,计算出的一个文件的属性)放到这个 list 里去。

但由于数据太多,如果用单线程跑的话,可能要跑几个月,所以想把这个任务拆开,而我不会多进程(多线程倒是试过,但是只能 120%左右,提升不大),所以想把这个任务写成多个程序,分开跑,每个程序的这个二维 list 都存成一个文件,都跑完之后再把这个文件合起来。

那么问题来了,我找了一天资料,依然不会把二维 list 存成文件。。。
file.write()只能存放字符串,而我也没找到用 NumPy 创建空的二维数组的函数(虽然一定有)。

所以来求助各位,多谢!

11374 次点击
所在节点    Python
31 条回复
nightv2
2016-03-04 21:33:33 +08:00
你的二维 list 是啥样子的? list 每一个元素事一个 list 么?", ".jion 把一个 list 转换为用逗号隔开的字符串,这样就可以把二维 list 转换为一个大的字符串
donghouhe
2016-03-04 21:36:51 +08:00
用 pickle 这个库
yanyuechuixue
2016-03-04 21:38:00 +08:00
@nightv2 嗯,每个 list 的元素都是一个 list ,在小的 list 里存放的是[str,str] 或(str,str)
我试试去。
eote
2016-03-04 21:38:42 +08:00
用 json 吧,比 pickle 更通用一些
Strikeactor
2016-03-04 21:39:35 +08:00
转成 json
Septembers
2016-03-04 21:40:09 +08:00
msg7086
2016-03-04 22:14:25 +08:00
你这个需求叫做序列化,具体可以搜索 Python 序列化。
Aether
2016-03-04 22:34:17 +08:00
存放的话推荐使用数据库, redis ,很简单的。
neoblackcap
2016-03-04 22:36:01 +08:00
用 Numpy 请一定要用它自带的矩阵数据结构,不要 list 套 list
yanyuechuixue
2016-03-05 00:17:22 +08:00
@eote
@Strikeactor
非常感谢!
这正是我需要的。
yanyuechuixue
2016-03-05 00:17:48 +08:00
@msg7086 谢谢!
random2case
2016-03-05 00:18:47 +08:00
冒昧问一下,如果写成二进制流的话,能不能合并在一起?
yanyuechuixue
2016-03-05 00:19:34 +08:00
@Septembers 谢谢!
20015jjw
2016-03-05 00:46:08 +08:00
lz 自己徒手发明了 external algorithm
lz 你看看 spark 嘛 这样就能分布化了 xd
你要找的是 serializer
seki
2016-03-05 01:04:04 +08:00
可能是我没理解对,就先按我理解的来说吧
二维 list 用 numpy 的二维数列就可以
如果你知道是 8*8 的,那直接 ones 或者 zeros 就好了
然后 numpy 是可以存变量为文件的,读取也没问题, packle 其实也是一种方法

multiprocessing 使用的时候对于函数的写法是需要一点技巧,可能需要掌握 functool
LINAICAI
2016-03-05 03:16:27 +08:00
序列化和反序列化
yangzh
2016-03-05 05:19:08 +08:00
kevinyoung
2016-03-05 09:50:35 +08:00
用 numpy ,话说数学计算怎么能离得开 numpy 呢

import numpy as np
two_d_list = [[1, 2], [3, 4]]
numpy_list = np.asarray(two_d_list)
print numpy_list.shape # 应该是(2, 2) ,也就是所谓的 2*2 的数组
savetxt("./my_list.txt", numpy_list) # 这样就以文本的形式把刚才的数组保存下来了

reloaded_list = loadtxt("./my_list.txt") # 又回来了

我自己在做一些计算的时候数据一般是在循环体里循环一次出一个,所以先放进嵌套的 Python 的 list 里面,然后用 np.asarray()转化成 ndarray ,然后再做处理就非常简单了,存取只是其中一个方面,而且只要对齐,任何尺寸的都是可以的。
staticor
2016-03-05 11:05:31 +08:00
我还想说 pandas, 能用 numpy 就多看看 pandas. 数据民工的建议
yanyuechuixue
2016-03-05 11:39:44 +08:00
@kevinyoung 谢谢!非常感谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/261191

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX