代码之家  ›  专栏  ›  技术社区  ›  Bussller Junior Vieira

最快的方法来计算一个字符在一个数组中出现的次数numpy.chararray公司

  •  3
  • Bussller Junior Vieira  · 技术社区  · 6 年前

    蟒蛇学家,

    什么是计算一个字符在事件中出现的最快方法 numpy.character 数组。

    我正在做以下工作:

    In [59]: for i in range(10):
    ...:     m = input("Enter A or B: ")
    ...:     rr[0][i] = m
    ...:     
    Enter A or B: B
    Enter A or B: B
    Enter A or B: B
    Enter A or B: A
    Enter A or B: B
    Enter A or B: A
    Enter A or B: A
    Enter A or B: A
    Enter A or B: B
    Enter A or B: A
    
    In [60]: rr
    Out[60]: 
    chararray([['B', 'B', 'B', 'A', 'B', 'A', 'A', 'A', 'B', 'A']],
              dtype='<U1')
    
    In [61]: %timeit a = rr.count('A')
    12.5 µs ± 206 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    In [62]: %timeit d = len(a[a.nonzero()])
    3.03 µs ± 54.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    

    2 回复  |  直到 6 年前
        1
  •  2
  •   Divakar    6 年前

    It's better to stick to regular NumPy arrays over the chararrays :

    注:

    chararray类的存在是为了向后兼容 numpy1.4,如果需要字符串数组,建议使用 数组,并使用 中的函数numpy.char文件快速矢量化字符串模块 操作。

    我们可以用 np.count_nonzero 数一数 True 'A' -

    np.count_nonzero(rr=='A')
    

    进近#2

    chararray 只保留单个字符元素,我们可以通过使用 uint8 然后进行比较和计数。计数会快得多,因为我们将处理数字数据。实施将是-

    np.count_nonzero(rr.view(np.uint8)==ord('A'))
    

    Python 2.x

    np.count_nonzero(np.array(rr.view(np.uint8))==ord('A'))
    

    时间安排

    原始样本数据上的计时并缩放到 10,000x 按比例的-

    # Original sample data
    In [10]: rr
    Out[10]: array(['B', 'B', 'B', 'A', 'B', 'A', 'A', 'A', 'B', 'A'], dtype='<U1')
    
    # @Nils Werner's soln
    In [14]: %timeit np.sum(rr == 'A')
    100000 loops, best of 3: 3.86 µs per loop
    
    # Approach #1 from this post
    In [13]: %timeit np.count_nonzero(rr=='A')
    1000000 loops, best of 3: 1.04 µs per loop
    
    # Approach #2 from this post
    In [40]: %timeit np.count_nonzero(rr.view(np.uint8)==ord('A'))
    1000000 loops, best of 3: 1.86 µs per loop
    
    # Original sample data scaled by 10,000x
    In [16]: rr = np.repeat(rr,10000)
    
    # @Nils Werner's soln
    In [18]: %timeit np.sum(rr == 'A')
    1000 loops, best of 3: 734 µs per loop
    
    # Approach #1 from this post
    In [17]: %timeit np.count_nonzero(rr=='A')
    1000 loops, best of 3: 659 µs per loop
    
    # Approach #2 from this post
    In [24]: %timeit np.count_nonzero(rr.view(np.uint8)==ord('A'))
    10000 loops, best of 3: 40.2 µs per loop
    
        2
  •  1
  •   Nils Werner    6 年前

    chararray is deprectated, use array(..., dtype='<U1') instead . 说你能行

    r = np.array([['B', 'B', 'B', 'A', 'B', 'A', 'A', 'A', 'B', 'A']])
    
    %timeit numpy.sum(r == 'A')
    # 4.82 µs ± 126 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)