【问题标题】:How to declare array of zeros in python (or an array of a certain size) [duplicate]如何在python中声明零数组(或一定大小的数组)[重复]
【发布时间】:2011-05-02 16:32:05
【问题描述】:

我正在尝试构建计数直方图...所以我创建了存储桶。 我知道我可以通过并附加一堆零,即沿着这些线的东西:

buckets = []
for i in xrange(0,100):
    buckets.append(0)

有没有更优雅的方法呢?我觉得应该有一种方法来声明一个特定大小的数组。

我知道 numpy 有 numpy.zeros 但我想要更通用的解决方案

【问题讨论】:

  • Python 的列表是列表,而不是数组。在 Python 中,您不会像在 C 中那样声明东西:您定义函数和类(通过 def 和 class 语句),并分配给变量,如果它们不存在,则在第一次分配时神奇地创建。此外,变量(和列表)不是包含对象的内存区域,而是引用对象的名称。一个对象只能包含在一个内存区域中,但可以被多个名称引用。
  • Python 没有“声明”,尤其是对于具有大小但未指定内容的容器。你想要一些东西,你写一个表达式。
  • ...分号完全没有必要

标签: python


【解决方案1】:
【解决方案2】:

为了完整性:要在 python 中声明一个多维零列表,您必须使用这样的列表推导:

buckets = [[0 for col in range(5)] for row in range(10)]

避免行之间的引用共享。

这看起来比chester1000 的代码更笨拙,但如果以后要更改这些值,这是必不可少的。有关详细信息,请参阅Python FAQ

【讨论】:

  • 是的,你是对的,除非出于某种奇怪的原因你想对同一个数组的 n 个副本进行操作 :)
【解决方案3】:

您可以将list 乘以整数n 以重复list n 次:

buckets = [0] * 100

【讨论】:

    【解决方案4】:

    使用这个:

    bucket = [None] * 100
    for i in range(100):
        bucket[i] = [None] * 100
    

    w, h = 100, 100
    bucket = [[None] * w for i in range(h)]
    

    它们都会输出正确的空多维桶列表 100x100

    【讨论】:

    • bucket = [[0] * w] * h 呢?
    • @RobinHood 使用您的想法 bucked[0][x] 将总是与例如相同桶[1][x]。即使在更改 bucket[0][x] 之后。
    【解决方案5】:

    使用 numpy

    import numpy
    zarray = numpy.zeros(100)
    

    然后使用Histogram库函数

    【讨论】:

    • 抱歉,numpy.zeros 被明确排除在外。
    【解决方案6】:

    问题是“如何声明零数组...”,但示例代码引用了 Python 列表:

    buckets = []   # this is a list
    

    但是,如果有人真的想初始化一个数组,我建议:

    from array import array
    
    my_arr = array('I', [0] * count)
    

    Python 纯粹主义者可能会声称这不是 pythonic 并建议:

    my_arr = array('I', (0 for i in range(count)))
    

    pythonic 版本非常慢,当你有数百个数组需要用数千个值初始化时,差异非常明显。

    【讨论】:

    • 嗨,为什么array('I', [0] * count) 不慢?我假设它将首先创建一个完整列表并基于该完整列表然后创建数组,这听起来......很糟糕。我猜想在你最后的代码 sn-p 中,懒惰实际上会非常有益并让它运行得更快?
    • 我无法证明为什么 ...我可以根据性能结果修改我的代码。我没有包括已经达成共识的结果。
    【解决方案7】:

    最简单的解决方案是

    "\x00" * size # for a buffer of binary zeros
    [0] * size # for a list of integer zeros
    

    一般来说,您应该使用更多的 Python 代码,例如列表理解(在您的示例中:[0 for unused in xrange(100)])或使用 string.join 用于缓冲区。

    【讨论】:

    • 我同意列表理解看起来更像 Pythonic。但是,我对它进行了计时,发现它比乘法语法慢了大约 10 倍。我知道,有些东西是预优化邪恶的。
    • 我正在创建一个array('I') 并使用(0 for i in range(count)) 来填充......而且速度非常慢:数组中有 28000 个项目。乘法语法要快得多。如果 'pythonic' 等同于慢,那么它与 'pythonic' 一起输出,与 fast 一起输入。
    【解决方案8】:

    根据收集后数据的实际处理方式,collections.defaultdict(int) 可能有用。

    【讨论】:

      【解决方案9】:

      我想通过发布一个示例程序及其输出来帮助您

      程序:-

      t=input("")
      
      x=[None]*t
      
      y=[[None]*t]*t
      
      for i in range(1,t+1):
      
            x[i-1]=i;
            for j in range(1,t+1):
                  y[i-1][j-1]=j;
      
      print x
      
      print y
      

      输出:-

      2
      
      [1, 2]
      
      [[1, 2], [1, 2]]
      

      我希望这可以清除您关于他们的声明的一些非常基本的概念。要使用其他一些特定值初始化它们,例如使用 0 初始化它们,您可以将它们声明为:

      x=[0]*10

      希望对您有所帮助..!! ;)

      【讨论】:

        【解决方案10】:

        如果您需要更多列:

        buckets = [[0., 0., 0., 0., 0.] for x in range(0)]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-13
          • 1970-01-01
          • 2011-05-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多