【发布时间】:2022-11-22 01:11:53
【问题描述】:
我正在尝试运行一个程序,该程序涉及将两个大小为 69496 乘以 511 的大型二进制 NumPy 数组相乘。我的数组是二进制的,我使用 Spyder 作为我的 IDE。
这是我的代码:
import numpy as np
import math
import re
def ip(A):
B=A.transpose()
C = np.dot(A, B)
[a, b] = C.shape
D=[]
for i in range (a):
print(i)
for j in range (i+1, a):
c= C[i, j]
D.append(c)
return(D)
因此,我提供给函数的输入“o”是一个大小为 69496 乘以 511 的二进制 NumPy 数组。
D = IP(o)
但是,我收到以下内存错误:
MemoryError: Unable to allocate 36.0 GiB for an array with shape (69496, 69496) and data type float64
我有 16 GB RAM,我有 Windows 11。有人可以给我建议如何解决这个问题吗?
【问题讨论】:
-
首先,我非常怀疑您的数组实际上是二进制或布尔值。错误消息显示 float64。
-
@水星;是的,错误消息说它是 float64,但是我的输入数组只包含 0 和 1。你能告诉我如何将 float 类型的数据转换为二进制数据吗?
-
你可以用astype将它转换成你想要的类型,比如
o.astype(np.bool)。 -
@Mercury:我试过 o.astype(np.bool),但我遇到了同样的错误。
-
可能是因为阵列仍然太大。 A 和 A.T 之间的点积本身应该首先复制 A,然后需要为内部 matmul 分配大量内存并存储 (69496, 69496) 输出(这本身将近 5GB)。您可能需要一个更有效的算法——就像我可以很容易地告诉您正在寻找 A 的自内积的上三角一样,所以您可能不需要在这里进行完整的点积。
标签: python python-3.x numpy numpy-ndarray