我需要能够存储numpy array一个dict用于缓存的目的.哈希速度很重要.
该array代表indicies,所以在对象的真实身份并不重要,值.可变性不是一个问题,因为我只对当前价值感兴趣.
我应该散列什么才能将其存储在一个dict?
我目前的方法是使用str(arr.data),这比md5我的测试更快.
我已经从答案中加入了一些例子来了解相对时间:
In [121]: %timeit hash(str(y))
10000 loops, best of 3: 68.7 us per loop
In [122]: %timeit hash(y.tostring())
1000000 loops, best of 3: 383 ns per loop
In [123]: %timeit hash(str(y.data))
1000000 loops, best of 3: 543 ns per loop
In [124]: %timeit y.flags.writeable = False ; hash(y.data)
1000000 loops, best of 3: 1.15 us per loop
In [125]: %timeit hash((b*y).sum())
100000 loops, …Run Code Online (Sandbox Code Playgroud) 给定一些对称整数矩阵列表,我想在以下等价关系下删除所有重复项:
二KXK矩阵M1,M2是等价的,如果有一些排列s上{1,...,k}使得对所有i和j在{1,...,k}我们有M1_ij = M2_s(i)s(j),即两个矩阵是“平等”的,如果我可以同时置换的行和列得到一个从其他。
不幸的是,我的幼稚方法(在构建列表时,检查列表中是否已存在新矩阵的任何排列)被证明太慢了。
我可能想到的一些可能更快的替代方法是将所有矩阵放入列表,将它们置换为“规范置换”,然后按照此处的描述删除重复项。但是,我也不知道如何在代码中实现这样的“规范排列”。
要进一步缩小范围:矩阵相对较小(k <= 4),列表将包含5或6位数字的矩阵,并且矩阵的必定dtype必须是某种整数类型(当前intc,但我可以更改)。
最终列表的顺序无关紧要,每个对等类的代表也没有生存。如果需要的话,整个过程可能需要花费几个小时,而不是几天。
有某种合理有效的方法可以实现这一目标吗?我是否再次错过了一些很酷的NumPy或SciPy设施,这对我有帮助吗?
根据要求,提供了一些小例子来说明等价关系如何工作:
矩阵{{1,1,1},{1,2,0},{1,0,3}}和{{1,1,1},{1,3,0},{1,0,2}}是等价的,因为置换{1,2,3}->{1,3,2}将一个变换为另一个。
矩阵{{1,1,1},{1,2,0},{1,0,3}}和{{1,1,0},{1,2,1},{0,1,3}}不是等价的,您必须在不对角线排列的情况下更改1的位置。