[英]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.