簡體   English   中英

在Numpy中乘以塊矩陣

[英]Multiplying Block Matrices in Numpy

大家好我是python新手我必須為課堂作業實施套索L1回歸。 這涉及求解涉及塊矩陣的二次方程。

minimize x^t * H * x  + f^t * x 
where x > 0

其中H是2×2塊矩陣,其中每個元素是ak維矩陣,x和f是2×1矢量,每個元素是ak維矢量。

我在考慮使用ndarrays。

這樣:

  np.shape(H) = (2, 2, k, k)
  np.shape(x) = (2, k)

但我發現np.dot(X,H)在這里不起作用。 有沒有簡單的方法來解決這個問題? 提前致謝。

首先,我確信轉換為矩陣將導致更高效的計算。 說明,如果你認為你的2k x 2k矩陣是2 x 2矩陣,那么你在向量空間的張量積中運算,並且必須使用tensordot而不是dot

試試吧,例如k = 5:

>>> import numpy as np
>>> k = 5

定義矩陣a和向量x

>>> a = np.arange(1.*2*2*k*k).reshape(2,2,k,k)
>>> x = np.arange(1.*2*k).reshape(2,k)
>>> x
array([[ 0.,  1.,  2.,  3.,  4.],
       [ 5.,  6.,  7.,  8.,  9.]])

現在我們可以繁殖我們的張量。 一定要選擇正確的軸,我沒有仔細測試下面的公式,可能會有錯誤

>>> result = np.tensordot(a,x,([1,3],[0,1]))
>>> result
array([[  985.,  1210.,  1435.,  1660.,  1885.],
       [ 3235.,  3460.,  3685.,  3910.,  4135.]])
>>> np.shape(result)
(2, 5)

np.einsum很好地控制哪些軸相加。

np.einsum('ijkl,jk',H,x)

是一種可能的(廣義)點積,(2,4)(H的第一個和最后一個暗點)

np.einsum('ijkl,jl',H,x)

是另一個。 你需要明確 - x哪個維度與H哪個維度相關。

暫無
暫無

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

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