如何使用 NumPy 数组作为字典中的键 - Python
how to use NumPy array as a key in dict - Python
我想使用 NumPy 数组作为键,其中每个键都有一组 NumPy 数组作为值。我想知道执行此操作(即插入、搜索)的最有效方法是什么。
my_keys = np.random.rand(5, 2)
my_keys
array([[0.05152605, 0.12405425],
[0.44344738, 0.87479441],
[0.39542315, 0.2788064 ],
[0.470308 , 0.73640885],
[0.58107681, 0.42968256]])
my_values = np.random.rand(10, 2)
my_values
array([[0.96544233, 0.38396357],
[0.55453457, 0.83432399],
[0.8736443 , 0.0506048 ],
[0.98617731, 0.41264541],
[0.76856053, 0.23441502],
[0.06770689, 0.27087991],
[0.29328327, 0.57327051],
[0.31798657, 0.11341894],
[0.76256025, 0.08786568],
[0.71370639, 0.30637008]])
假设我的第一个键是 [0.05152605, 0.12405425]
,我希望 my_values
的前两行的值为 [[0.96544233, 0.38396357],[0.55453457, 0.83432399]]
类似问题有post,但是没有代码片段。例如,我试过
提供的内容
my_array = numpy.arange(4).reshape((2,2))
my_dict = {}
my_dict[my_array.tobytes()] = None
然而,它对我不起作用。
您可以压缩键和重塑值视图,然后通过对键进行散列来构建 dict:
>>> d = {k.tobytes(): v for k, v in zip(my_keys, my_values.reshape(5,2,2))}
{b'\x0f4U\xe6\x9cN\xd9?v\x97z\xcc\xf6\xd7\xd1?':
array([[0.76856053, 0.23441502], [0.06770689, 0.27087991]]),
b'1\xbcHW\x9fa\xaa?\xe6\x07\xae\xf2\x04\xc2\xbf?':
array([[0.96544233, 0.38396357], [0.55453457, 0.83432399]]),
b'[3\xa6\x1eqa\xdc?B\x8e\xb5\xd8P\xfe\xeb?':
array([[0.8736443 , 0.0506048 ], [0.98617731, 0.41264541]]),
b'\x89?\xedd.\x98\xe2?\xc3#\xb7G\xeb\x7f\xdb?':
array([[0.76256025, 0.08786568], [0.71370639, 0.30637008]]),
b'\xcd\x04\xc3\xb9\x86\x19\xde?\xdf\x84\xe7J\xa9\x90\xe7?':
array([[0.29328327, 0.57327051], [0.31798657, 0.11341894]])}
然后,给定一个键k
,你可以查询dictionnary:
>>> k = my_keys[2]
>>> d[k.tobytes()]
array([[0.76856053, 0.23441502],
[0.06770689, 0.27087991]])
我想使用 NumPy 数组作为键,其中每个键都有一组 NumPy 数组作为值。我想知道执行此操作(即插入、搜索)的最有效方法是什么。
my_keys = np.random.rand(5, 2)
my_keys
array([[0.05152605, 0.12405425],
[0.44344738, 0.87479441],
[0.39542315, 0.2788064 ],
[0.470308 , 0.73640885],
[0.58107681, 0.42968256]])
my_values = np.random.rand(10, 2)
my_values
array([[0.96544233, 0.38396357],
[0.55453457, 0.83432399],
[0.8736443 , 0.0506048 ],
[0.98617731, 0.41264541],
[0.76856053, 0.23441502],
[0.06770689, 0.27087991],
[0.29328327, 0.57327051],
[0.31798657, 0.11341894],
[0.76256025, 0.08786568],
[0.71370639, 0.30637008]])
假设我的第一个键是 [0.05152605, 0.12405425]
,我希望 my_values
的前两行的值为 [[0.96544233, 0.38396357],[0.55453457, 0.83432399]]
类似问题有post
my_array = numpy.arange(4).reshape((2,2))
my_dict = {}
my_dict[my_array.tobytes()] = None
然而,它对我不起作用。
您可以压缩键和重塑值视图,然后通过对键进行散列来构建 dict:
>>> d = {k.tobytes(): v for k, v in zip(my_keys, my_values.reshape(5,2,2))}
{b'\x0f4U\xe6\x9cN\xd9?v\x97z\xcc\xf6\xd7\xd1?':
array([[0.76856053, 0.23441502], [0.06770689, 0.27087991]]),
b'1\xbcHW\x9fa\xaa?\xe6\x07\xae\xf2\x04\xc2\xbf?':
array([[0.96544233, 0.38396357], [0.55453457, 0.83432399]]),
b'[3\xa6\x1eqa\xdc?B\x8e\xb5\xd8P\xfe\xeb?':
array([[0.8736443 , 0.0506048 ], [0.98617731, 0.41264541]]),
b'\x89?\xedd.\x98\xe2?\xc3#\xb7G\xeb\x7f\xdb?':
array([[0.76256025, 0.08786568], [0.71370639, 0.30637008]]),
b'\xcd\x04\xc3\xb9\x86\x19\xde?\xdf\x84\xe7J\xa9\x90\xe7?':
array([[0.29328327, 0.57327051], [0.31798657, 0.11341894]])}
然后,给定一个键k
,你可以查询dictionnary:
>>> k = my_keys[2]
>>> d[k.tobytes()]
array([[0.76856053, 0.23441502],
[0.06770689, 0.27087991]])