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中如何创建非常大的二维数组?小白求助几个问题

20 回复

不负责任说一句 用 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 。。。

稀疏矩阵

稀疏矩阵啊

回到顶部