簡體   English   中英

如何使用NumPy數組實現字典?

[英]How can I implement a dictionary with a NumPy array?

我需要在NumPy數組中寫入大量的數字對。 由於很多這些對的第二個值為0,我想要制作類似於字典的東西。 問題是我已經閱讀了關於結構化數組的NumPy文檔,看起來像在頁面上構建的字典只能使用字符串作為鍵。

除此之外,我需要插入和搜索以具有log(N)復雜性。 我想使用常規的NumPy數組作為存儲來制作我自己的紅黑樹結構,但我相當確定有一種更容易的方法。

語言是Python 2.7.12。

所以你有一個(N,2)數組, x[:,1]中的許多值都是0。

insertion是什么意思? 為數組添加一個值(N+1,2) 或者只是將x[i,:]改為新的東西?

搜索怎么樣? numpy數組非常適合查找第i個值x[i,:] ,但不適合查找與z匹配的z python numpy過濾二維數組的條件

scipy.sparse實現了各種形式的稀疏矩陣,如果不到十分之一的可能值非零,則有用。 一種格式是dok ,一種密鑰字典。 它實際上是一個dict子類,鍵是2d索引元組(i,j) 其他格式將其值存儲為數組,例如row,cols和data。

structured arrays適用於具有適度數量的命名字段的情況,並且每個字段可以包含不同類型的數據。 但我認為將(N,2)數組轉換為具有2個字段的(N,)數組並不會有幫助。

================

您的意見表明您不熟悉如何存儲或訪問numpy數組。

陣列由一個扁平1d的data buffer (只是c字節陣列)和屬性等shapestridesitemsizedtype

假設它是np.arange(100)

In [1324]: np.arange(100).__array_interface__
Out[1324]: 
{'data': (163329128, False),
 'descr': [('', '<i4')],
 'shape': (100,),
 'strides': (4,)
 'typestr': '<i4',
 'version': 3}

所以,如果我要求x[50]它計算的進步,4 bypes /元件,* 50個元素= 200個字節,並詢問,在c代碼用於在4個字節163329128+200 ,並將其返回它們作為一個整數(實際上是np.int32類型的對象。

對於結構化數組,每個元素的類型descr和bytes將更大,但訪問將是相同的。 對於二維數組,它將采用形狀並將元組考慮在內以找到適當的索引。

(N,2)整數數組的步幅為(8,4)。 因此,訪問x[10,1]元素的偏移量為10*8 + 1*4 = 84 x[:,1]i*8 for i in range... offsets。

但在所有情況下,它依賴於以矩形可預測模式排列的值。 numpy數據結構沒什么numpy 它們相對較快,因為許多操作都是用編譯代碼編寫的。

使用數組可以對值進行排序,按值訪問項目以及重新排列元素,但這不是一個優點。 這些操作通常會生成一個新數組,其值以某種新模式從舊模式復制到新模式。

只有幾個內置的numpy數組子類,主要是np.matrixnp.masked_array ,它們不擴展訪問方法。 子類化並不像普通的Python類那么容易,因為它的numpy有很多自己編譯的代碼。 子類必須具有__new__方法而不是常規__init__

有一些Python模塊可以維護排序列表, bisectheapq 但我不知道他們將如何幫助你解決大量的內存問題。

字典的最基本形式是稱為HashMap的結構。 實現hashmap依賴於將密鑰轉換為可以快速查找的值。 一個病態示例將使用int作為鍵:鍵1的值將在array[1] ,鍵2的值將在array[2] ,哈希函數只是標識函數。 您可以使用numpy數組輕松實現它。

如果你想使用其他類型,只需要編寫一個好的哈希函數來將這些鍵轉換成你的數組中的唯一索引。 例如,如果你知道你有一個(int, int)元組,並且第一個值永遠不會超過100,你可以做100*key[1] + key[0]

哈希函數的實現將決定你的字典替換。

暫無
暫無

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

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