如果您追求的是速度,那么您最好从不同的数据结构开始。制作一个 3D 数据数组n*y*x
和一个 1D 键数组,键的索引与数据数组的 n_index 匹配。这样我们就可以向量化了。
抽象意义上的:
import numpy
a = numpy.arange(10 * 5 * 5).reshape((10, 5, 5))
numpy.random.shuffle(a)
b = numpy.array(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])
print b[numpy.argsort(a[:, 3, 3])]
应用您当前的数据结构:
# Simulating my_dict
y_dim = 5
x_dim = 6
my_dict = {chr(i + 97): numpy.random.randn(y_dim, x_dim) for i in xrange(10)}
# To initially convert your data structure
new_my_dict = {}
keys = numpy.zeros(len(my_dict), dtype=numpy.str)
data = numpy.zeros((len(my_dict), y_dim, x_dim))
for i, (key, value) in enumerate(my_dict.iteritems()):
keys[i] = key
data[i, :, :] = value
new_my_dict[key] = i
# the sorting function
def top_per_location(y, x):
return keys[numpy.argsort(data[:, y, x])]
def get_data(key):
index = new_my_dict.get(key)
if index is not None:
return data[index]
else:
raise KeyError('{} not in data!'.format(key))
def add_data(key, new_data):
global data, keys
if key in new_my_dict:
data[new_my_dict[key]] = new_data
else:
new_my_dict[key] = data.shape[0] + 1
keys = numpy.append(keys, key)
data = numpy.concatenate((data, numpy.expand_dims(new_data, axis=0)))
print(top_per_location(3, 3))
add_data('frog', numpy.random.randn(y_dim, x_dim))
add_data('fish', numpy.random.randn(y_dim, x_dim))
print(get_data('frog'))
如果您需要进行大量查找,您仍然可以拥有您的字典,但使其成为一个简单的 {key: index} 字典,索引指向数据的 n_dimension。