![](/img/trans.png)
[英]How can I implement a dictionary whose value is mutable length array in 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
字節陣列)和屬性等shape
, strides
, itemsize
和dtype
。
假設它是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.matrix
和np.masked_array
,它們不擴展訪問方法。 子類化並不像普通的Python類那么容易,因為它的numpy
有很多自己編譯的代碼。 子類必須具有__new__
方法而不是常規__init__
。
有一些Python模塊可以維護排序列表, bisect
和heapq
。 但我不知道他們將如何幫助你解決大量的內存問題。
字典的最基本形式是稱為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.