簡體   English   中英

Python 多維稀疏數組

[英]Python multi dimensional sparse array

我正在做一個需要處理 3 維大數組的項目。 我使用的是 numpy 3d 數組,但我的大部分條目都將為零,因此 memory 的大量浪費。Scipy 稀疏似乎只允許二維矩陣。 還有其他方法可以存儲 3D 稀疏數組嗎?

scipy.sparse具有多種格式,盡管只有一對格式具有一組有效的數字運算。 不幸的是,這些是很難擴展的。

dok使用索引的元組作為字典鍵。 因此,將2d推廣到3d或更容易。 coo具有rowcoldata屬性數組。 從概念上講,添加第三depth (?)很容易。 lil可能需要列表中的列表,這可能會造成混亂。

但是csrcsc將數組存儲在indicesindptrdata數組中。 這種格式是幾年前由從事線性代數問題的數學家以及有效的數學運算(特別是矩陣乘法)設計的。 (相關論文在源代碼中被引用)。

因此,表示3d稀疏陣列不是問題,但是實現有效的矢量運算可能需要一些基礎數學研究。

您是否真的需要3d布局來進行矢量操作? 例如,是否可以至少暫時將尺寸的2重塑為1?

逐元素運算(*,+,-)與2或3d版本的平面數組數據一樣工作。 np.tensordot通過將輸入重塑為2D數組並應用np.dot np.tensordot處理nD矩陣乘法。 即使在3d數組上使用np.einsum ,乘積求和通常也只在一對尺寸上(例如'ijk,jl-> ikl')

3D表示在概念上可以很方便,但是我想不出需要它的數學運算(而不是2或1d)。

總的來說,我認為重塑數組比嘗試查找/實現真正的3d稀疏運算要快得多。

你是對的; 看起來似乎沒有成熟的工具可以處理n維稀疏數組。 如果您只需要訪問數組中的元素,則可以使用在元組上鍵入字典的選項。 看到:

稀疏的3D矩陣/數組在Python中?

如果您需要在稀疏3d矩陣上進行運算,則會變得更加困難-您可能必須自己進行一些編碼。

見python庫: https://sparse.pydata.org/en/stable/construct.html

下面給出了二維示例 - 從上面提供的頁面復制。 但是,它也適用於 2 個以上的維度。 我目前正在使用這個庫處理可變數量的維度。 正如一個小提示:如果稀疏矩陣的維數超過 2,則無法轉換為已知的 SciPy 稀疏矩陣。

import sparse

coords = [[0, 1, 2, 3, 4],

          [0, 1, 2, 3, 4]]

data = [10, 20, 30, 40, 50]

s = sparse.COO(coords, data, shape=(5, 5))

s.todense()
array([[10,  0,  0,  0,  0],
       [ 0, 20,  0,  0,  0],
       [ 0,  0, 30,  0,  0],
       [ 0,  0,  0, 40,  0],
       [ 0,  0,  0,  0, 50]])

暫無
暫無

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

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