Python 有效计算二维数组中每个数字的重复次数
我需要在多个一维数组中找到重复的数字,以及每次重复的重复次数,这对一维数组np很好。唯一,但似乎不适用于二维数组,我已经搜索了类似的答案,但我需要更详细的报告。(所有数字的出现次数,位置索引) 这个答案不匹配,我希望得到一张包含更多信息的地图,比如一些最新的数据,我不喜欢回收,也许这是不合适的,但我会尽量找到不使用循环的方法,因为我对速度的要求非常苛刻 例如:Python 有效计算二维数组中每个数字的重复次数,python,Python,我需要在多个一维数组中找到重复的数字,以及每次重复的重复次数,这对一维数组np很好。唯一,但似乎不适用于二维数组,我已经搜索了类似的答案,但我需要更详细的报告。(所有数字的出现次数,位置索引) 这个答案不匹配,我希望得到一张包含更多信息的地图,比如一些最新的数据,我不喜欢回收,也许这是不合适的,但我会尽量找到不使用循环的方法,因为我对速度的要求非常苛刻 例如: a = np.array([[1,2,2,2,3], [0,1,1,1,2],
a = np.array([[1,2,2,2,3],
[0,1,1,1,2],
[0,0,0,1,0]])
# The number of occurrences for each number
# int count
# 0. 0
# 1. 1
# 2. 3
# 3. 1
#need the output:
#Index = the number of statistics, the number of repetitions
[[0 1 3 1]
[1 3 1 0]
[4 1 0 0]]
因为这是循环的一部分,所以您需要一种有效的矢量化方法来一次完成更多的统计数据行,并尝试避免再次循环
我使用数据包聚合来计算结果。该函数通过构造一个区分行的key1来实现这一点,数据本身作为key2,以及一个包含所有1的二维数组,虽然可以输出,但我认为这只是暂时的度量。需要正确的方法
from numpy_indexed import group_by
def unique2d(x):
x = x.astype(int); mx = np.nanmax(x)+1
ltbe = np.tile(np.arange(x.shape[0])[:,None],(1,x.shape[1]))
vtbe = np.zeros(x.shape).astype(int) + 1
groups = npi.group_by((ltbe.ravel(),x.ravel().astype(int)))
unique, median = groups.sum(vtbe.ravel())
ctbe = np.zeros(x.shape[0]*mx.astype(int)).astype(int)
ctbe[(unique[0] * mx + unique[1]).astype(int)] = median
ctbe.shape=(x.shape[0],mx)
return ctbe
unique2d(a)
>array([[0, 1, 3, 1],
[1, 3, 1, 0],
[4, 1, 0, 0]])
希望有好的建议和算法,谢谢我能想到的最少代码行如下:
import numpy as np
import numpy_indexed as npi
a = np.array([[1,2,2,2,3],
[0,1,1,1,2],
[0,0,0,1,0]])
row_idx = np.indices(a.shape, dtype=np.int32)[0]
axes, table = npi.Table(row_idx.flatten(), a.flatten()).count()
我还没有对此进行分析,但它不包含任何隐藏的非矢量化for循环;我怀疑您在numpy中无论如何都不能更快地完成它。不过,我也不希望它的执行速度比您当前的解决方案快很多。使用尽可能小的int类型可能会有所帮助
请注意,此函数不假定a
的元素构成一个连续的集合;轴标签在轴
元组中返回;这可能是您正在寻找的行为,也可能不是。但是修改表
类中的代码以符合当前布局并不困难
如果速度是您最关心的问题,那么您的问题可能会很好地映射到numba。您可能需要的是使用axis参数,但目前尚未实现(请参阅问题和)。正如链接问题中所建议的,您现在可以将其用于。除非可能性为0,否则我将拒绝任何明显的沿_轴循环应用_的方法。这只是循环的另一种语法。结论令人惊讶,结果完全正确,但基于统计数据,几乎是表速度的两倍(1000*1000)我不确定是否要采用更干净、更清晰的方式,我用1生成了所有的group_,目标数组不满意。但仍然感谢您的回复HMM;不确定那里发生了什么。Table使用np.add.at;我经常发现,与groupby.sum使用的np.add.reduce相比,它的速度奇慢;这可能就是它。但无论如何,对于这种问题我认为numba的速度快了10倍。谢谢你的建议,我会试试numba