簡體   English   中英

使用numpy快速更新矩陣

[英]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_csvC引擎一起使用以讀取文件。 它比np.genfromtxt快很多,因為引擎是c / Cython優化的。
  • 您可以讀取內存中的整個文件,然后進行計算。 這是最簡單的方法,但是從效率的角度來看,您的CPU將大部分處於空閑狀態以等待輸入。 這次可以更好地用於計算內容。
  • 您可以嘗試逐行讀取和處理(例如:使用cvs模塊)。 盡管io到最后仍然是瓶頸,但是您已經處理了文件。 這里的問題是由於Python開銷,您仍然會有一些效率損失。
  • 可能最好的組合是使用pandas.read_csv讀取塊,同時設置iteratorchunk_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.

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