簡體   English   中英

numpy矩陣乘法或einsum運算中的MemoryError

[英]MemoryError in numpy matrix multiplication or einsum operations

我正在處理數千行的行和列的二進制(僅0和1)矩陣。 例如,行數在2000-7000之間,列數在4000-15000之間。我的計算機具有100g以上的RAM。

令我驚訝的是,即使具有這些大小,我也會收到以下代碼的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_sums的行。

請注意,我的代碼也有其他操作,還有其他類似尺寸的矩陣計算出的統計信息,但重量超過100 g時,我認為應該沒問題。

僅僅因為您的計算機具有100 GB的物理內存並不意味着您的操作系統願意或能夠分配如此大量的連續內存。 它必須是連續的,因為那是NumPy數組通常的方式。

您應該弄清楚輸出矩陣的大小,然后嘗試自己創建一個類似的矩陣:

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

查看是否能夠分配所需的單個數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM