使用Python简单创建随机数的二维数组
我知道在Python中,创建一个满是零的NxN数组的简单方法是:
[[0]*N for x in range(N)]
不过,假设我想用随机数来填充这个数组:
[[random.random()]*N for x in range(N)]
这样做不行,因为每次生成的随机数会被复制N次,所以我的数组里并没有NxN个独特的随机数。
有没有办法在一行代码里做到这一点,而不使用循环呢?
7 个回答
3
你可以使用列表推导式。
[[random.random() for x in xrange(N)] for y in xrange(N)]
https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions
不过对于大型的多维数组,我建议你使用numpy。
4
只需在你的列表推导式中使用 [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]]
6
这是创建一个二维数组的方法:
k = np.random.random ([3,4]) * 10
k.astype(int)
20
使用这个来自numpy的简单函数:
创建一个大小为(4,4)的数组,里面填满了数字1到4
np.random.randint(1, 5, size=(4, 4))
[1 2 1 2]
[2 2 2 4]
[4 1 1 2]
[4 2 2 4]
50
你可以使用嵌套的列表推导式:
>>> 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
(虽然不是标准库,但非常流行):
>>> 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 ]])
(顺便说一下,养成在说 list
时确实指的是 list
,而把 array
留给 numpy 的 ndarray
的习惯是个好主意。实际上还有一个内置的 array
模块,里面有自己的 array
类型,这样会让事情更加混乱,但这个模块用得相对较少。)