我需要生成一个包含随机列的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中编写这段代码。
答案 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倍。