从随机列生成2d numpy数组

时间:2016-08-26 13:56:21

标签: python numpy

我需要生成一个包含随机列的3xn矩阵,以确保每列不会包含多次相同的数字。我目前正在使用以下代码:

n=10
set = np.arange(0, 10)
matrix = np.random.choice(set, size=3, replace=False)[:, None]
for i in range(n):
    column = np.random.choice(set, size=3, replace=False)[:, None]
    matrix = np.concatenate((matrix, column),axis=1)
print matrix

给出了我期望的输出:

[[2 1 7 2 1 9 7 4 5 2 7]
 [4 6 3 5 9 8 1 3 8 4 0]
 [3 5 0 0 4 5 4 0 2 5 3]]

但是,似乎代码运行得不够快。我知道使用cython实现for循环可能会有所帮助,但我想知道是否有更高效的方法可以在python中编写这段代码。

2 个答案:

答案 0 :(得分:1)

你可以使用Python的随机模块进一步加快速度(可能是由于这个issue):

import random
np.array([random.sample(range(10), 3) for _ in range(n)]).T
n = 10**6

%timeit t = np.array([random.sample(range(10), 3) for _ in range(n)]).T
1 loop, best of 3: 6.25 s per loop

%%timeit
matrix = np.empty((3, n), dtype=np.int)
for i in range(n):
    matrix[:, i] = np.random.choice(10, size=3, replace=False)
1 loop, best of 3: 19.3 s per loop

答案 1 :(得分:0)

正如评论中已经提到的,重复连接到numpy数组是一个坏主意,因为你将不得不重新分配内存。正如您已经知道结果数组的最终大小,您可以简单地在开始时分配它,然后只迭代列:

matrix = np.empty((3, n), dtype=np.int)
for i in range(n):
    matrix[:, i] = np.random.choice(10, size=3, replace=False)

至少在我的机器上,这比你的版本快6倍。