[英]Fast matrix update with numpy
我的問題是,我需要從一個格式的文件中讀取大約5000萬行
x1 "\t" x2 "\t" .. x10 "\t" count
然后計算矩陣A的分量A [j] [i] =總和(在所有行上)count * x_i * x_j。
我嘗試了兩種方法,都讀取每行的文件行:
1)保留一個Python矩陣並在for循環中更新:
for j in range(size):
for i in range(size):
A[j][i] += x[j] * x[i] * count
2)使A為一個numpy數組,並使用numpy.add更新:
numpy.add(A, count * numpy.outer(x, x))
讓我感到驚訝的是,第二種方法比第一種慢了大約30%。 兩者都很慢-整個文件大約需要10分鍾...
有什么方法可以加快矩陣的計算? 也許有一些功能可以完全從文件(或大塊)中讀取數據,而不是逐行讀取數據? 有什么建議么?
一些想法:
pandas.read_csv
與C
引擎一起使用以讀取文件。 它比np.genfromtxt快很多,因為引擎是c / Cython優化的。 pandas.read_csv
讀取塊,同時設置iterator
和chunk_size
參數,並一次處理塊。 我敢打賭,有一個最佳的塊大小會擊敗其他方法。 您的矩陣是對稱的,請使用第一種方法來計算上半部分(每行55次計算,而不是100次計算)。
第二種方法比較慢。 我不知道為什么,但是,如果要實例化5000萬個小型ndarray,則可能是瓶頸,可能只使用一個ndarray並復制每行數據
x = np.zeros((11,))
for l in data.readlines():
x[:] = l.split()
A+=np.outer(x[:-1],x[:-1])*x[-1]
可能會導致加速。
根據計算機上可用的內存量,您嘗試使用正則表達式來解析值,並使用numpy重塑和切片來應用計算。 如果內存不足,請考慮采用類似的方法,但以1M行塊的形式讀取文件。
txt = open("C:/temp/input.dat").read()
values = re.split("[\t|\n]", txt.strip())
thefloats = [ float(x) for x in values]
mat = np.reshape(thefloats, (num_cols, num_rows))
for i in range(len(counts)):
mat[:-1,i] *= counts[-1,i]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.