表示元素的巧妙技巧np.stack((x, y))
因为整数可以变得更快:
In [92]: %timeit np.dot(np.stack((x, y)).transpose(), np.array([bins, 1]))
109 µs ± 6.55 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [94]: %timeit bins*x + y
12.1 µs ± 260 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
此外,第二个解决方案的最后部分可以稍微简化,只需考虑
np.unique(bins * x + y, return_counts=True)[1].reshape((bins, bins))
更重要的是,由于我们正在处理等距的非负整数,np.bincount https://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html将会超越np.unique
;这样,上面的内容可以归结为
np.bincount(bins * x + y).reshape((bins, bins))
总而言之,这比您当前正在做的事情提供了相当多的性能:
In [78]: %timeit make_table(x, y, bins) # Your first solution
3.86 ms ± 159 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [79]: %timeit make_table2(x, y, bins) # Your second solution
443 µs ± 23.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [101]: %timeit np.unique(bins * x + y, return_counts=True)[1].reshape((bins, bins))
307 µs ± 25 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [118]: %timeit np.bincount(bins * x + y).reshape((10, 10))
30.3 µs ± 3.44 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
您可能还想知道np.histogramdd https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogramdd.html#numpy.histogramdd它同时处理舍入和合并,尽管它可能会比舍入和使用慢np.bincount
.