簡體   English   中英

一維numpy數組與scipy稀疏矩陣之間的點積

[英]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可能是其他稀疏格式,但是對於這樣的計算,它將轉換為csrcsc .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.

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