可以创建一个像Python词典这样的结构,但在其中使用numpy阵列?
,例如,如果我们有2个命名
numpy.ndarray
和keys
vals
,我们如何使用它们来创建类似于常规python词典的类别,但得到了NumpyHashmap
S的支持?
这样做的目的是比Python词典具有更高的记忆效率结构。
numpy.ndarray
可以不变。
NumpyHashmap
您可以使用稀疏阵列模仿这种行为。这是依靠
import numpy as np
keys = np.array([1, 13, 24, 35, 92], dtype=np.uint16)
vals = np.array([1.234, 2.345, 3.456, 4.567, 5.678], dtype=np.float32)
# How to create a numpy-backed dictionary/hashmap?
hashmap = NumpyHashmap(keys, vals)
print(hashmap[13]) # 2.345
的最小实现:scipy.sparse
打印:
import numpy as np
import scipy.sparse as sp
class NumpyHashMap:
"""A hash map for numpy arrays"""
def __init__(self, keys, vals):
shape = (np.max(keys) + 1, 1)
self._lookup = sp.csr_array((vals, (keys, np.zeros_like(keys))), shape=shape)
def __getitem__(self, keys):
keys = np.atleast_1d(keys)
return self._lookup[keys, [0]]
keys = np.array([1, 13, 24, 35, 92], dtype=np.uint16)
vals = np.array([1.234, 2.345, 3.456, 4.567, 5.678], dtype=np.float32)
lookup = NumpyHashMap(keys, vals)
print(lookup[[1, 13, 24, 45]])
so而不是
[1.234 2.345 3.456 0. ]
KeyError
将返回
0
。该实施可以适用于例如取而代之的是返回
np.nan
或提出和错误,并确定不存在哪个密钥。Maybe仍然有帮助!