Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有效计算二维数组中每个数字的重复次数_Python - Fatal编程技术网

Python 有效计算二维数组中每个数字的重复次数

Python 有效计算二维数组中每个数字的重复次数,python,Python,我需要在多个一维数组中找到重复的数字,以及每次重复的重复次数,这对一维数组np很好。唯一,但似乎不适用于二维数组,我已经搜索了类似的答案,但我需要更详细的报告。(所有数字的出现次数,位置索引) 这个答案不匹配,我希望得到一张包含更多信息的地图,比如一些最新的数据,我不喜欢回收,也许这是不合适的,但我会尽量找到不使用循环的方法,因为我对速度的要求非常苛刻 例如: a = np.array([[1,2,2,2,3], [0,1,1,1,2],

我需要在多个一维数组中找到重复的数字,以及每次重复的重复次数,这对一维数组np很好。唯一,但似乎不适用于二维数组,我已经搜索了类似的答案,但我需要更详细的报告。(所有数字的出现次数,位置索引)

这个答案不匹配,我希望得到一张包含更多信息的地图,比如一些最新的数据,我不喜欢回收,也许这是不合适的,但我会尽量找到不使用循环的方法,因为我对速度的要求非常苛刻

例如:

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