2010-10-30 99 views
116

我正在嘗試構建計數的直方圖...所以我創建了桶。 我知道我可以只經歷並追加了一堆零即沿着這些路線的東西:如何在python(或特定大小的數組)中聲明零數組

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

有沒有更優雅的方式來做到這一點?我覺得應該有一種方法來聲明一個特定大小的數組。

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

+2

Python的列表是列表,而不是數組。在Python中,你不像C中那樣聲明一些東西:你定義函數和類(通過def和class語句),然後賦值給變量,如果它們不存在的話,它們會在第一次賦值時神奇地創建。另外,變量(和列表)不是包含對象的名稱,而是包含名稱的內存區域。一個對象只能包含在一個存儲器區域中,但可以被幾個名稱引用。 – pillmuncher 2010-10-30 01:10:52

+1

Python沒有「聲明」,尤其是具有大小但未指定內容的容器。你想要的東西,你寫一個表達式。 – 2010-10-30 01:14:55

+3

...和分號完全不必要 – bstpierre 2010-10-30 02:03:52

回答

250
buckets = [0] * 100 
+18

小心 - [這種技術不推廣到多維數組或列表](https://docs.python.org/2/faq/programming.html#how-do -i創建-A-多維列表)。 – rphv 2016-02-20 02:12:31

15

您可以通過一個整數n乘以list重複listn時間:

buckets = [0] * 100 
3

最簡單的解決辦法be

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

一般而言,您應該使用更多的pythonic代碼,如列表理解(在您的示例中:[0 for unused in xrange(100)])或使用string.join作爲緩衝區。

+3

我同意列表的理解看起來更Pythonic。但是,我對它進行了計時,發現它比乘法語法慢大約10倍。我知道,有些事情是預先優化邪惡的。 – Lenna 2013-01-22 20:39:41

+0

我正在創建'array('I')'並且正在使用'(0代表我在範圍內(count))'來填充......並且它非常慢:數組中有28000個項目。乘法語法要快得多。如果'pythonic'等於慢,那麼它與'pythonic'並且以* fast *結尾。 – IAbstract 2016-02-18 12:33:25

11

使用numpy的

import numpy 
zarray = numpy.zeros(100) 

然後使用Histogram庫函數

+2

對不起,但明確排除了numpy.zeros。 – 2012-02-02 16:28:48

0

取決於你它的採集後實際上是要與數據做的,collections.defaultdict(INT)可能是有用的。

16

使用此:

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

OR

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

他們都將輸出適當的空多維水桶名單100x100的

+0

'bucket = [[0] * w] * h'呢? – RobinHood 2016-07-12 16:18:01

77

只是爲了完整性:要聲明的python零的多維列表你必須使用這樣的列表理解:

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

以避免行之間的引用共享。

這看起來比chester1000的代碼更笨拙,但如果值稍後應該改變,它是必不可少的。有關更多詳細信息,請參閱Python FAQ

+0

是的,你是對的,除非出於某種奇怪的原因,你想在同一陣列的n個副本上進行操作:) – meeDamian 2012-02-06 08:35:34

-1

嗯,我想通過發佈示例程序和它的輸出

計劃,以幫助你: -

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

希望它可以幫助.. !! ;)

-2

如果你需要更多的列:

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

的問題說 「如何申報零的陣列...」 但隨後的示例代碼引用Python列表:

buckets = [] # this is a list 

然而,如果有人想真正初始化數組,我建議:

from array import array 

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

Python的純粹主義者可能會聲稱這是不是Python的和建議:

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

Python的版本是非常緩慢的,當你有幾百個陣列成千上萬值來進行初始化,所不同的是相當明顯。