Easy way to create a 2D array with random numbers (Python)

I know that an easy way to create an NxN array with zeros in Python is:

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

However, suppose I want to create an array by filling it with random numbers:

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

This does not work because every random number that is created is then replicated N times, so my array does not have unique random numbers NxN.

Is there a way to do this on a single line without using for loops?

+10
python arrays random
source share
4 answers

You can use nested list comprehension:

 >>> 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]] 

Or use numpy (non-stdlib, but very popular):

 >>> 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 It's a good idea to get used to saying list when you mean list and reserve an array for numpy ndarray s. Actually there is a built-in module array with its own array , so this confuses things even more, but it's relatively rarely used .)

+28
source share

Just use [random.random() for i in range(N)] inside your list comprehension.

Demo:

 >>> 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]] 
+4
source share

You can use lists.

 [[random.random() for x in xrange(N)] for y in xrange(N)] 

https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

For large multidimensional arrays, I suggest you use numpy.

+3
source share

This can be done without cycles. Try this simple line of code to generate a 2 by 3 random number matrix with a mean of 0 and a standard deviation of 1.

Syntax:

 import numpy numpy.random.normal(mean, standard deviation, (rows,columns)) 

example:

 numpy.random.normal(0,1,(2,3)) 
+2
source share

All Articles