Python numpy矩阵乘法或einsum运算中的内存错误

Python numpy矩阵乘法或einsum运算中的内存错误,python,numpy,matrix,out-of-memory,Python,Numpy,Matrix,Out Of Memory,我正在处理行和列的二进制(仅0和1)矩阵,其顺序为几千。例如,行数在2000-7000之间,列数在4000-15000之间。我的电脑内存超过100克 我感到惊讶的是,即使有了这些尺寸,我也会通过以下代码获得MemoryError。为了再现性,我举了一个例子,其中矩阵(10*20)比下面两个都小,这会引起这个错误: import numpy as np my_matrix = np.random.randint(2,size=(10,20)) tr, tc = np.triu_

我正在处理行和列的二进制(仅0和1)矩阵,其顺序为几千。例如,行数在2000-7000之间,列数在4000-15000之间。我的电脑内存超过100克

我感到惊讶的是,即使有了这些尺寸,我也会通过以下代码获得
MemoryError
。为了再现性,我举了一个例子,其中矩阵(10*20)比下面两个都小,这会引起这个错误:

   import numpy as np

   my_matrix = np.random.randint(2,size=(10,20))
   tr, tc = np.triu_indices(my_matrix.shape[0],1)
   ut_sums = np.sum(my_matrix[tr] * my_matrix[tc], 1)

   denominator = 100
   value = 1 - ut_sums.astype(float)/denominator
   np.einsum('i->', value)
我尝试将上述代码中的元素乘法替换为einsum,如下所示,但它也会生成相同的MemoryError:

   import numpy as np

   my_matrix = np.random.randint(2,size=(10,20))
   tr, tc = np.triu_indices(my_matrix.shape[0],1)
   ut_sums = np.einsum('ij,ij->i', my_matrix[tr], my_matrix[tc])

   denominator = 100
   value = 1 - ut_sums.astype(float)/denominator
   np.einsum('i->', value)
在这两种情况下,打印的回溯都指向正在计算
ut\u和的行


请注意,我的代码也有其他操作,还有其他统计数据是在类似大小的矩阵上计算的,但超过100g,我认为这应该不是问题。

仅仅因为您的计算机有100 GB的物理内存,并不意味着您的操作系统愿意或能够分配如此大量的连续内存。它必须是连续的,因为NumPy数组通常是这样的

您应该弄清楚输出矩阵的大小,然后尝试自己创建一个类似的矩阵:

arr = np.zeros((10000, 10000))

查看是否可以分配一个任意大的数组。

我也可以创建带有np.0((100000,100000))的矩阵,但由于内存错误,无法创建大小为1000000*1000000的矩阵。但是,我的矩阵要小得多。我能帮你解决吗?矩阵为二进制(仅限1和0)且稀疏。我可以使用scipy的稀疏矩阵吗?elemet wise乘法或einsum运算是否适用于稀疏矩阵?是的,如果您的数据是稀疏的,您应该利用NumPy和friends中的稀疏矩阵功能。如果你的矩阵只有0和1:你使用的是
dtype=bool
?不,我没有使用dtype=bool。现在我想到了它,我可以在创建矩阵时使用它,但我还没有想到如何用布尔矩阵计算ut_和。另外,刚才我尝试了scipy.sparse的lil_矩阵,像上面的第一个代码块一样进行元素乘法。但在一台功能相对强大的机器上,它运行了大约15分钟,然后出现了MemoryError故障。stacktrack指向我从原始创建稀疏矩阵的那条线:my_matrix=scipy.sparse.lil_matrix(np.random.randint(2,size=(100000,100000)))这对我来说似乎有点不合理。如果值为0和1,您确实需要弄清楚如何切换到dtype=bool。这将节省大量内存。或者至少在这里切换到np.uint8.M2C,使用
ulimit
增加进程可以从内核请求的内存量。第二,@JohnZwinck
np.zero
可能不是检查您可以从内核获得的最大内存的好测试。从中看到答案