[英]Numpy/Python: Efficient matrix as multiplication of cartesian product of input matrix
[英]Numpy efficient big matrix multiplication
要在磁盤上存儲大矩陣,我使用numpy.memmap。
以下是測試大矩陣乘法的示例代碼:
import numpy as np
import time
rows= 10000 # it can be large for example 1kk
cols= 1000
#create some data in memory
data = np.arange(rows*cols, dtype='float32')
data.resize((rows,cols))
#create file on disk
fp0 = np.memmap('C:/data_0', dtype='float32', mode='w+', shape=(rows,cols))
fp1 = np.memmap('C:/data_1', dtype='float32', mode='w+', shape=(rows,cols))
fp0[:]=data[:]
fp1[:]=data[:]
#matrix transpose test
tr = np.memmap('C:/data_tr', dtype='float32', mode='w+', shape=(cols,rows))
tr= np.transpose(fp1) #memory consumption?
print fp1.shape
print tr.shape
res = np.memmap('C:/data_res', dtype='float32', mode='w+', shape=(rows,rows))
t0 = time.time()
# redifinition ? res= np.dot(fp0,tr) #takes 342 seconds on my machine, if I multiplicate matrices in RAM it takes 345 seconds (I thinks it's a strange result)
res[:]= np.dot(fp0,tr) # assignment ?
print res.shape
print (time.time() - t0)
所以我的問題是:
我也對使用有限內存使用的線性方程組(SVD和其他)的算法感興趣。 也許這種算法稱為核外或迭代,我認為有一些類比,如硬盤< - > ram,gpu ram < - > cpu ram,cpu ram < - > cpu cache。
在這里我還發現了一些關於PyTables中矩陣乘法的信息。
我也在R中發現了這個 ,但我需要它用於Python或Matlab。
Dask.array使用阻塞算法和任務調度為大型磁盤陣列提供了一個numpy接口。 它可以很容易地進行核外矩陣乘法和其他簡單的numpy操作。
阻塞的線性代數更難,你可能想看看關於這個主題的一些學術着作。 Dask確實支持高和瘦的矩陣上的QR和SVD分解。
無論對於大型數組,你真的想要阻塞算法,而不是天真的遍歷,這會以不愉快的方式擊中磁盤。
考慮使用NumExpr進行處理: https : //github.com/pydata/numexpr
......在內部,NumExpr采用自己的矢量化虛擬機,該虛擬機是圍繞分塊讀取策略設計的,以便有效地在內存中的最佳大小的數據塊上運行。 如果調整得當,它可以輕松擊敗天真的NumPy操作。
NumExpr可能會在您的問題細分中涵蓋#2。 如果使用可流式二進制格式解決#1問題,則可以在加載數據文件時使用chunked-read方法 - 如下所示:
with open('path/to/your-data.bin', 'rb') as binary:
while True:
chunk = binary.read(4096) # or what have you
if not chunk:
break
如果這對你來說太低級,我建議你看看HDF5庫和格式: http : //www.h5py.org - 這是我所知道的基於NumPy結構的二進制序列化的最佳解決方案。 h5py
模塊支持壓縮,分塊讀取,dtypes,元數據...你可以命名它。
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.