Python中如何创建非常大的二维数组?小白求助几个问题
各位大神,
我现在需要构造一个 7 万*1 万大小的数组存储一些数据,
我的大概写法是:
T=[]
for i in range(70000):
--t = [0 for col in range(10000)]
--t[col]=f(i) //根据 i 会修改 t 中的某些值
--T.append(t)
这样可以获得 T,但是巨慢。。。
电脑直接死机 T^T 。。卡了快一个小时运行完毕。。。
求问有没有其他解决方法。。。
Python中如何创建非常大的二维数组?小白求助几个问题
不负责任说一句 用 numpy 吧
在Python里创建大二维数组,最直接的就是用NumPy的numpy.zeros()或numpy.ones()。比如要搞个10000x10000的浮点数数组,直接np.zeros((10000, 10000))就行。这会在内存里开出一块连续空间,速度很快。
但如果你说的“非常大”是指大到内存根本放不下,那得换思路,不能全放内存里。这时候可以考虑用numpy.memmap(内存映射文件)。它允许你把数组存在硬盘上,用的时候只加载需要的那部分到内存,像这样:
import numpy as np
# 创建一个内存映射文件数组,形状为(100000, 100000),类型是float64
# 这会在当前目录生成一个叫'big_array.dat'的文件
big_array = np.memmap('big_array.dat', dtype='float64', mode='w+', shape=(100000, 100000))
# 现在可以像操作普通NumPy数组一样操作它,但数据实际在硬盘上
# 例如,给第一行赋值
big_array[0] = np.arange(100000)
# 记得操作完后,如果需要确保数据写入硬盘,可以删除引用或调用flush
del big_array
用memmap时,mode='w+'是创建新文件并读写。如果文件已存在,可以用mode='r+'读写或mode='r'只读。这方法适合数据太大,需要分块处理或者当缓存用的情况。
另外,如果数据特别稀疏(大部分是0),用scipy.sparse里的稀疏矩阵格式(如csr_matrix, csc_matrix)能省巨多内存,只存非零元素的位置和值。
总结一下:内存够用NumPy数组,内存不够用numpy.memmap,数据稀疏用scipy.sparse。
这么大个二维数组,就算用 c++的 vector 动态分配实现也是慢的可以吧,你可以试试 numpy 的矩阵来保存一下,主要应该是要一次性分配好内存,要不然这样递增式的分配,不慢才怪喽
构建一个一维数组,然后写个函数做映射?
假设你 t 里边存的是 32 位 int, 70000 * 10000 * 32 / (1 << 30) = 20G, 电脑内存够么?
落了个 4, 5G, sorry
我在想什么样的场景需要这样做
真的有这样的数组要求最好还是放数据库中吧
import numpy as np
Dense or sparse?
#4 Python 里的 int 占 28 字节
pandas + numpy 吧,注意内存消耗
求解一个有几万个约束的优化模型中的一个步骤,需要构造技术矩阵~ 亲测numpy可用
非常感谢大家!
numpy直接生成一个全为零的相应规模的矩阵(因为我的矩阵大部分值是零),然后根据需要修改对应值就可以了!
如果矩阵是稀疏的, sklearn 中有一些处理稀疏矩阵的算法。
这种情况用 scipy 的 sparse 创建稀疏矩阵会大大提高效率
嗷,好的我研究下~谢谢!
试试 pypy
MATLAB 。。。
稀疏矩阵
稀疏矩阵啊

