2014-06-08 51 views
7

我知道一個簡單的方法來創建一個N×N的陣列全在Python零的是:簡單的方式

[[0]*N for x in range(N)] 

然而,假設我想創建該陣列用隨機數填充它:

[[random.random()]*N for x in range(N)] 

這不起作用,因爲每個創建隨機數,然後複製N次,所以我的數組沒有N×N個獨特的隨機數。

有沒有辦法做到這一點,而不使用for循環?

回答

18

你可以使用嵌套列表理解:

>>> N = 5 
>>> import random 
>>> [[random.random() for i in range(N)] for j in range(N)] 
[[0.9520388778975947, 0.29456222450756675, 0.33025941906885714, 0.6154639550493386, 0.11409250305307261], [0.6149070141685593, 0.3579148659939374, 0.031188652624532298, 0.4607597656919963, 0.2523207155544883], [0.6372935479559158, 0.32063181293207754, 0.700897108426278, 0.822287873035571, 0.7721460935656276], [0.31035121801363097, 0.2691153671697625, 0.1185063432179293, 0.14822226436085928, 0.5490604341460457], [0.9650509333411779, 0.7795665950184245, 0.5778752066273084, 0.3868760955504583, 0.5364495147637446]] 

或者使用numpy(非STDLIB但很受歡迎):

>>> import numpy as np 
>>> np.random.random((N,N)) 
array([[ 0.26045197, 0.66184973, 0.79957904, 0.82613958, 0.39644677], 
     [ 0.09284838, 0.59098542, 0.13045167, 0.06170584, 0.01265676], 
     [ 0.16456109, 0.87820099, 0.79891448, 0.02966868, 0.27810629], 
     [ 0.03037986, 0.31481138, 0.06477025, 0.37205248, 0.59648463], 
     [ 0.08084797, 0.10305354, 0.72488268, 0.30258304, 0.230913 ]]) 

(PS這是一個好主意的習慣來獲得如果你的意思是list並且保留array爲numpy ndarray s。實際上有一個內置的array模塊,它有自己的array類型,所以混淆東西甚至更多,但它相對很少使用。)

+0

如果你想要的數字是連續的整數什麼,而不是隨機的? – FaCoffee

2

只需在您的列表理解中使用[random.random() for i in range(N)]即可。

演示:

>>> import random 
>>> N = 3 
>>> [random.random() for i in range(N)] 
[0.24578599816668256, 0.34567935734766164, 0.6482845150243465] 
>>> M = 3 
>>> [[random.random() for i in range(N)] for j in range(M)] 
[[0.9883394519621589, 0.6533595743059281, 0.866522328922242], [0.5906410405671291,   0.4429977939796209, 0.9472377762689498], [0.6883677407216132,  0.8215813727822125, 0.9770711299473647]] 
1

它可以沒有循環完成。嘗試的代碼這個簡單的線對均值爲0,標準偏差產生隨機數的2×3矩陣1.

的語法是:

numpy.random.normal(平均值,標準偏差,(行,列))

例如:

numpy.random.normal(0,1,(2,3))