更快的numpy.random.shuffle有长度限制吗?

更快的numpy.random.shuffle有长度限制吗?,numpy,shuffle,Numpy,Shuffle,我正在使用numpy.random.shuffle来洗牌数据列表。列表的长度很大,所以我想随机抽取一些数据来做我的工作 我使用以下代码实现此功能: # data_list is a numpy array of shape (num_data,) index = np.arange(data_list.size) np.random.shuffle(index) index = index[:len_limit] data = data_list[index] 但由于指数很大,洗牌的速度很慢

我正在使用
numpy.random.shuffle
来洗牌数据列表。列表的长度很大,所以我想随机抽取一些数据来做我的工作

我使用以下代码实现此功能:

# data_list is a numpy array of shape (num_data,)
index = np.arange(data_list.size)
np.random.shuffle(index)
index = index[:len_limit]
data = data_list[index]
但由于指数很大,洗牌的速度很慢


有什么改进性能的建议吗?

这是一个常见问题。我使用以下方法:

替换图纸

idxs = np.random.randint(0, high=len(data), size=(N,))
result = data[idxs]
import random
idxs = random.sample(xrange(len(data)), N)
result = data[idxs]
无需更换的图纸

idxs = np.random.randint(0, high=len(data), size=(N,))
result = data[idxs]
import random
idxs = random.sample(xrange(len(data)), N)
result = data[idxs]
其中,
data
是原始数据集,
N
是所需样本数。只要使用
replace=False
尝试,这两种方法都应该比随机播放快

示例(使用与问题中相同的变量):


您需要numpy版本1.7.0或更高版本。

很酷,很高兴他们最终将此添加到numpy中。这绝对是一个缺失的功能。清晰的答案。谢谢。虽然它方便多了,但我担心它与OP的代码完全一样,只是使用了
np.random.permutation
而不是
np.random.shuffle
,请看。@Jaime:既然你提到了它,我记得我看过那段代码了。我忘了是Python库(在
random.sample
中)具有选择方法的启发式。还有一个关于性能的公开问题:谢谢。当您要保存索引时,此方法优于选择。