【问题标题】:Count object in Tab Separated Array in Python 2.7Python 2.7 中制表符分隔数组中的计数对象
【发布时间】:2016-02-08 09:28:42
【问题描述】:

我有一个整数数组r = [ 242 302 377 ..., 1090 225 203]。我想计算242r 数组中的出现次数。我使用了这样的计数方法:

asd = r.count(242)
print asd

但它给了我错误

AttributeError: 'numpy.ndarray' 对象没有属性 'count'。

如何解决?

【问题讨论】:

  • 用逗号 (,) 分隔数组的值可能有效。

标签: python arrays python-2.7 numpy


【解决方案1】:

最简单的理解方式:

my_count = 0
for i in r:
    if (i == 242):
        my_count += 1
print my_count

【讨论】:

    【解决方案2】:

    可以尝试下面的代码来计算 -

    类型 1-

    r = [ 451, 242, 300, 424, 242, 567, 810, 242, 151, 413]
    
    n= [i for i in r if i == 242]
    
    print(len(n))
    

    类型 2-

    count = 0
    r = [ 451, 242, 300, 424, 242, 567, 810, 242, 151, 413]
    for i in r:
       if i == 242:
          count+=1
    
    print(count)
    

    【讨论】:

      【解决方案3】:

      用逗号分隔您的列表值:r = [ 242, 302, 242, 377, 1090, 225, 203]:

      r = [ 242, 302, 242, 377, 1090, 225, 203]
      
      asd = r.count(242)
      
      print asd
      

      【讨论】:

        【解决方案4】:

        没有“制表符分隔数组”之类的东西。 r 的显示与 numpy array 一致(错误消息也是如此)。它可能是从制表符分隔的 CSV 加载的。无论如何,count 是一种列表方法,而不是数组方法。要么将其转换为列表,要么使用其中一种迭代解决方案。

        有一个数组bincount。由于您的数组似乎是合理范围内的整数,例如0-1000),这里可能适用。

        制作一个样本数组:

        In [147]: r=np.random.randint(0,1000,2000)
        In [148]: r
        Out[148]: array([170, 754, 151, ..., 115, 299, 879])
        

        它的str 显示是:

        In [166]: print(r)
        [170 754 151 ..., 115 299 879]
        

        这可能会让不了解numpy 的 Python 程序员感到困惑。

        bincount 查找范围内所有值的计数:

        In [152]: np.bincount(r)
        Out[152]: 
        array([4, 1, 2, 1, 1, 5, 4, 3, 2, 1, 1, 1, 3, 3, 2, 4, 3, 2, 1, 1, 0, 1, 4,
               ...
               1, 3, 0, 2, 1, 2, 3, 1, 2, 3, 3])
        

        我可能应该使用np.bincount(r,minlength=1000)

        该计数列表中的第 7 个值是 4,所以让我们选择它:

        In [176]: np.bincount(r,minlength=1000)[6]
        Out[176]: 4
        

        如果我先将r 转换为列表,我可以使用count

        In [177]: r.tolist().count(6)
        Out[177]: 4
        

        迭代解决方案也有效,但速度较慢:

        def foo(a,v):
            my_count=0
            for i in r:
                if (i==v):
                    my_count+=1
            return my_count
        
        In [178]: foo(r,6)
        Out[178]: 4
        

        时间测试:

        In [180]: timeit foo(r,6)
        1000 loops, best of 3: 983 us per loop
        
        In [181]: timeit len([i for i in r if i==6])
        1000 loops, best of 3: 985 us per loop
        
        In [182]: timeit r.tolist().count(6)
        10000 loops, best of 3: 125 us per loop
        
        In [183]: timeit np.bincount(r)[6]
        100000 loops, best of 3: 8.2 us per loop
        

        另一个好的数组版本在一个编译表达式中测试value

        In [189]: timeit (r==6).sum()
        10000 loops, best of 3: 29.5 us per loop
        

        要同时测试多个值,请使用如下表达式:

        In [194]: (r==np.array([6,42,242])[:,None]).sum(axis=1)
        Out[194]: array([4, 5, 1])
        

        【讨论】:

          【解决方案5】:

          简单示例:

          如果您开始使用支持.count() 函数的结构的列表类型,则无法应用:

          list.count(x)
          

          其中list 是一种可列出的集合,count() 是一个函数,它采用单个参数x,它标识要检查哪个元素的出现

          否则你可以尝试应用类似的东西:

          counter = 0
          
          for x in list:
              if x == 1:
                  counter += 1
          
          print('Counter: ', counter)
          

          其中list 是一个可列出的集合;

          【讨论】:

          • 投反对票的人能否为答案投反对票提供理由?我
          • 你的意思是iterabler.tolist().count(1) 可能会起作用。
          • 以上代码不存在语法问题;两种解决方案产生相同的结果。我很想知道为什么它被否决了。事实上,@Dlucidone 下面的解决方案具有相同类型的语法。
          猜你喜欢
          • 2016-12-16
          • 1970-01-01
          • 1970-01-01
          • 2019-07-25
          • 1970-01-01
          • 2013-09-01
          • 2017-07-26
          • 1970-01-01
          • 2018-02-01
          相关资源
          最近更新 更多