簡體   English   中英

從計算運算符/矩陣向量積的代碼構造(稀疏)NumPy 數組?

[英]Construct (sparse) NumPy array from code that computes the operator/matrix-vector product?

在科學計算中,我們經常需要構建計算微分算子的矩陣。 編寫應用運算符的代碼通常比顯式構造矩陣更容易。 是否有一個庫可以接收代碼(假設它只使用線性運算)並輸出矩陣,理想情況下是稀疏形式?

例子:

# computes finite differences
def myop(a):
  return a[1:]-a[:-1]

a = np.array(5)
myop(a)

計算“a”向量的有限差分. 我現在想要這樣的東西

a = some_library.array(5)
op = myop(a)
print(op.as_matrix())

這應該給我矩陣表示:

[[-1, 1, 0, 0, 0],
 [0, -1, 1, 0, 0],
 [0, 0, -1, 1, 0],
 [0, 0, 0, -1, 1]]

擁有矩陣非常有用,例如用於計算轉置算子或分析稀疏模式。 從技術上講,應該可以使用自動微分工具並提取 op() 的雅可比行列式,但我沒有找到任何有效處理整個雅可比行列式的 AD 庫,特別是如果它是稀疏的。 他們似乎要么每行一次,要么每列一次雅可比行列式,即使只有幾百個變量,這也非常慢。

一種簡單的方法:

In [568]: arr = np.zeros((4,5),int)
In [569]: arr[np.arange(4),np.arange(4)]=-1
In [570]: arr[np.arange(4),np.arange(1,5)]=1
In [571]: arr
Out[571]: 
array([[-1,  1,  0,  0,  0],
       [ 0, -1,  1,  0,  0],
       [ 0,  0, -1,  1,  0],
       [ 0,  0,  0, -1,  1]])

有各種np.diag...函數,但是由於您不想要方陣,我認為這會更容易。

scipy.sparse庫通常用於有限差分問題,並具有各種dia構造函數。 但這需要更多的閱讀。

暫無
暫無

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

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