>>> import numpy_indexed as npi
>>> import numpy as np
>>> a = np.array([[0,0,1,1,2,2], [4,4,8,8,10,10]]).T
>>> a
array([[ 0, 4],
[ 0, 4],
[ 1, 8],
[ 1, 8],
[ 2, 10],
[ 2, 10]])
>>> npi.group_by(a[:, 0]).sum(a[:,1])
(array([0, 1, 2]), array([ 8, 16, 20], dtype=int32))
我想在大型集合(约1m行)上对第一列聚集的第二列的子集执行计算。有没有一种有效的(和/或矢量化的)方法来使用group_by
by numpy_indexed
的输出,以便在这些计算的输出中添加一个新列?在上面的sum
示例中,我希望生成下面的输出。在
如果有一种不首先使用numpy_indexed
的有效方法来实现这一点,那也将非常有帮助。在
每个索引对象都有一个逆属性,它将减少的值映射回其原始范围;为了举例说明,我们可以写下:
而且这个属性也在GroupBy对象上公开;因为实际上将分组值映射回它们的输入范围是一个非常有用的操作:
^{pr2}$一般来说,numpy_索引的来源可以启发如何执行这种常见的操作;group_按.var面临着同样的问题,例如,将每个组的平均值广播回组成它的组的每个元素,以计算每组中的错误。但是更好的教程当然也不会有什么坏处。在
你能对你要解决的问题作一个更高层次的描述吗?当你对npi所提供的设计模式有了更为自如的思考时,你就可以从更高的层次上简化你的代码。在
一种使用^{} 生成那些唯一标记和间隔移位索引的方法,然后^{} 为{}-
另一种避免使用
^{pr2}$np.unique
并可能对性能有益的方法如下-为了进一步提高性能,我们应该使用
np.bincount
。因此,np.add.reduceat(a[:,1],idx)
可以被np.bincount(tags, a[:,1])
代替。在样本运行-
现在,列出的方法假设第一列已经排序。如果不是这样,我们需要按第一列
argsort
对数组进行排序,然后使用建议的方法。因此,对于未排序的案例,我们需要以下内容作为预处理-对抗
np.unique
让我们根据内置的
flatnonzero
+cumsum
来计时基于自定义np.unique
的方法来创建移位索引:idx
和基于唯一性的id/tags:tags
。对于这种情况,我们事先知道labels列已经排序,我们避免任何排序,就像np.unique
所做的那样。这使我们在性能上有优势。所以,让我们来验证一下。在方法-
使用自定义函数-
时间安排-
相关问题 更多 >
编程相关推荐