2013-12-08 61 views
1

嗨新手循環來這裏蟒蛇...所以請原諒我,如果這是一個基本的問題替換由列表理解

我想提出我的代碼很短,發現有幾種簡單的方法去通過將for方括號內側的排序列表

例如

x = [] 
for i in range(10): 
    x.append(i) 
print x 

等同於:

y[i for i in range(10)] 
print y 

,所以我想縮短以類似的方式

import matplotlib as plt 
import numpy as np 
y = [] 
for i in xrange(499): 
    y.append(np.random.binomial(500,.5)) 

plt.hist(y) 

這個我試過以下,但它沒有工作

z[np.random.binomial(500,.5) for i in xrange(499)] 

回答

4

此功能稱爲列表理解。看看this documentation看看他們是如何工作的。

但是,在這種特殊情況下,您不需要列表理解,因爲numpy.random.binomial需要size參數。生成包含499個樣本的載體,你可以這樣做:

z = np.random.binomial(500, 0.5, size=499) 
1

哪裏是?

y = [i for i in range(10)] 
#^

z = [np.random.binomial(500,.5) for i in xrange(499)] 
#^
+0

同樣的地方'='也是'y' :) –

1

numpy.fromiter可能是你最好的朋友。它可以讓你從一個可迭代的對象中創建一個新的一維數組。

基本上是:

>>> iterable = (x*x for x in range(5)) 
>>> np.fromiter(iterable, np.float) 
array([ 0., 1., 4., 9., 16.]) 

這樣對你:

>>> iterable = np.asarray([np.random.binomial(500,.5) for x in xrange(499)]) 
>>> np.fromiter(iterable, np.float) 
array([ 256., 251., 254., 229., 260., 253., 246., 231., 247., 
    255., 245., 229., 269., 257., 248., 244., 224., 238., 
    247., 250., 255., 239., 254., 276., 226., 241., 253., 
    247., 264., 264., 244., 254., 259., 246., 253., 254., 
    241., 269., 239., 246., 252., 251., 255., 247., 240., 
    248., 264., 237., 239., 249., 252., 234., 239., 260., 
    258., 252., 238., 240., 253., 262., 242., 282., 256., 
    247., 241., 243., 252., 241., 265., 232., 261., 253., 
    237., 256., 263., 232., 248., 258., 236., 261., 243., 
    250., 245., 262., 250., 255., 255., 230., 238., 245., 
    267., 246., 245., 249., 260., 233., 240., 282., 246., 
    245., 245., 249., 256., 256., 245., 260., 241., 245., 
    266., 237., 260., 242., 237., 265., 249., 256., 249., 
    276., 264., 246., 256., 244., 253., 229., 249., 242., 
    252., 234., 246., 232., 233., 250., 261., 239., 263., 
    269., 254., 254., 246., 255., 241., 269., 259., 230., 
    239., 249., 249., 267., 247., 219., 250., 257., 238., 
    260., 254., 253., 244., 240., 245., 244., 257., 225., 
    258., 269., 238., 248., 238., 254., 256., 284., 263., 
    238., 254., 249., 261., 243., 244., 250., 236., 240., 
    257., 262., 246., 227., 261., 266., 232., 250., 255., 
    261., 253., 241., 252., 242., 244., 246., 244., 237., 
    236., 286., 249., 245., 251., 245., 250., 272., 241., 
    238., 247., 263., 258., 266., 240., 253., 266., 255., 
    234., 245., 243., 266., 271., 251., 263., 237., 237., 
    253., 250., 230., 245., 254., 242., 245., 265., 247., 
    245., 242., 254., 255., 236., 234., 253., 257., 228., 
    246., 236., 261., 244., 240., 259., 239., 254., 239., 
    263., 260., 229., 266., 248., 242., 247., 251., 255., 
    255., 251., 248., 254., 258., 236., 248., 248., 247., 
    269., 236., 255., 231., 246., 258., 246., 254., 248., 
    250., 265., 232., 259., 248., 241., 246., 239., 241., 
    242., 268., 257., 239., 244., 240., 252., 258., 241., 
    256., 256., 240., 246., 253., 257., 258., 232., 243., 
    269., 248., 240., 249., 264., 246., 233., 245., 243., 
    241., 240., 241., 228., 281., 252., 254., 266., 236., 
    246., 249., 258., 242., 249., 254., 251., 249., 256., 
    236., 247., 234., 252., 250., 246., 249., 246., 220., 
    261., 230., 250., 225., 248., 233., 244., 258., 250., 
    251., 259., 243., 249., 264., 250., 244., 255., 254., 
    244., 230., 244., 237., 250., 267., 255., 236., 250., 
    226., 257., 239., 253., 259., 231., 256., 251., 266., 
    239., 260., 278., 248., 248., 238., 258., 234., 260., 
    264., 261., 255., 266., 259., 236., 270., 244., 233., 
    231., 252., 251., 262., 260., 243., 263., 250., 250., 
    247., 261., 251., 229., 250., 237., 250., 252., 262., 
    244., 246., 251., 249., 253., 246., 257., 245., 248., 
    255., 268., 255., 253., 212., 241., 260., 259., 243., 
    242., 246., 263., 251., 244., 252., 245., 265., 238., 
    270., 253., 254., 242., 246., 265., 240., 255., 255., 
    276., 255., 252., 260., 235., 256., 230., 269., 240., 
    249., 254., 234., 250., 251., 243., 248., 250., 240., 
    253., 259., 242., 255., 269., 252., 253., 230., 237., 
    255., 247., 263., 231., 241., 258., 241., 252., 251., 
    259., 241., 257., 262., 268., 256., 249., 239., 275., 
    242., 262., 258., 244.]) 

而一個基本的列表理解是表演者爲您的小型陣列,這將是更高性能的,如果你正在尋找使用數組更大的尺寸。

3

這應該工作:

z = [np.random.binomial(500,.5) for i in xrange(499)]

在這種情況下numpy的函數可以接受的大小第三個參數,這樣可能更快。

z = np.random.binomial(500, .5, 499)