[英]Dot product between 1D numpy array and scipy sparse matrix
假設我有Numpy數組p
和Scipy稀疏矩陣q
這樣
>>> p.shape
(10,)
>>> q.shape
(10,100)
我想做p和q的點積。 當我嘗試使用numpy時,我得到以下信息:
>>> np.dot(p,q)
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist packages/IPython/core/interactiveshell.py", line 2883, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-96-8260c6752ee5>", line 1, in <module>
np.dot(p,q)
ValueError: Cannot find a common data type.
我在Scipy文檔中看到
從NumPy 1.7開始,np.dot尚不了解稀疏矩陣,因此使用它會導致意外結果或錯誤。 應該先獲取相應的密集矩陣
但這違反了我使用稀疏矩陣的目的。 太好了,我如何在稀疏矩陣和一維numpy數組(numpy矩陣,我都願意接受)之間做點積而不丟失矩陣的稀疏性?
我正在使用Numpy 1.8.2和Scipy 0.15.1。
使用*
:
p * q
請注意, *
對於稀疏矩陣使用類似矩陣的語義,而不是類似數組的語義,因此它計算矩陣乘積而不是廣播乘積。
稀疏矩陣不是numpy數組或矩陣,盡管大多數格式使用多個數組來存儲其數據。 通常,常規的numpy函數不了解稀疏矩陣,因此您應該依靠使用稀疏版本的函數和運算符。
根據大眾的需求,最新的np.dot
稀疏感知,盡管我不知道它如何作用的細節。 在1.18中,我們有幾種選擇。
user2357112
建議p*q
。 首先使用密集數組,我有點懷疑,想知道它是否會嘗試使用逐個元素相乘(並且由於廣播錯誤而失敗)。 但這有效。 有時像*
這樣的運算符會將控制權傳遞給第二個參數。 但是只是為了確保我嘗試了幾種選擇:
q.T * p
np.dot(p, q.A)
q.T.dot(p)
都給出相同的密集(100,)數組。 注意-這是一個數組,而不是稀疏矩陣結果。
要獲得稀疏矩陣,我需要使用
sparse.csr_matrix(p)*q # (1,100) shape
q
可能是其他稀疏格式,但是對於這樣的計算,它將轉換為csr
或csc
。 .T
操作便宜,因為如果只需要將格式從csr
切換為csc
。
如果p
是2d數組,例如(2,10),則檢查這些替代方案是否有效將是一個好主意。
Scipy具有用於稀疏矩陣乘法的內置方法。
文檔中的示例:
>>> import numpy as np
>>> from scipy.sparse import csr_matrix
>>> Q = csr_matrix([[1, 2, 0], [0, 0, 3], [4, 0, 5]])
>>> p = np.array([1, 0, -1])
>>> Q.dot(p)
array([ 1, -3, -1], dtype=int64)
檢查以下資源:
http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csc_matrix.dot.html http://docs.scipy.org/doc/scipy/reference/sparse.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.