用随机数创建一个二维数组的简单方法(Python)

24

我知道在Python中创建一个NxN的全零数组的简单方法是:

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

然而,假设我想通过填充随机数来创建该数组:

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

这种方法行不通,因为每个随机数都会被复制 N 次,因此我的数组中并没有 NxN 个独特的随机数。

有没有一种方法可以在单行中完成,而不使用 for 循环?


我知道这已经晚了6年,但创建一个N*N的零矩阵更高效的方法是[[0]*N]*N - Aravind Suresh Thakidayil
7个回答

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

(顺便说一句,养成说“列表”而不是“数组”的习惯并将“数组”保留给numpy的ndarray是一个好主意。实际上,Python有一个内置的array模块和它自己的array类型,这更令人困惑,但相对很少使用。)


1
如果您想要数字是顺序整数,而不是随机的呢? - FaCoffee
1
@FaCoffee,假设你想要[A,B)范围内的整数,你可以这样做:(A + np.random.random((N,N)) * (B - A)).astype(int) - Ethan Chen

20

使用numpy中的这个简单函数:

用数字1-4填充的大小为(4,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]

我该如何将无穷大添加到这个数组中? - user12315602

6

这是如何创建一个二维数组:

k = np.random.random ([3,4]) * 10
k.astype(int)

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

3

不需要循环即可完成。尝试使用这行简单的代码来生成一个2行3列的随机数矩阵,其均值为0,标准差为1。

语法如下:

import numpy

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

例子:

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

通常情况下,您希望您的随机数是随意分布的,而不是像正态分布一样聚集在平均值周围。 - gherson
所以请尝试使用以下代码: "numpy.random.uniform(low=0.0, high=1.0, size=None)¶ [...] 样本在半开区间[low, high)上均匀分布" - gherson

3

1
import numpy as np  #np is shortcut of numpy

#Syntax : np.random.randint(the range for ex if you choose 100 then your array elements will be within the range 0 to 100, size = (row size, col size)

a = np.random.randint(100, size = (5,4)) #a is a variable(object)
print(a)

输出

[[49 81 57 96]
 [64 95 54 53]
 [63 77 68 74]
 [96 38 29 41]
 [13 39 99 43]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接