有效地从numpy数组中采样行

时间:2017-03-07 13:50:28

标签: python arrays performance numpy sampling

我想知道如何从高维numpy数组中有效地采样行。

目前,这就是我的工作:

n=11000000
d=28
X = np.random.randn(n, d)  
idx =np.random.choice(range(n), 10000000, replace=False)

time_l=[]
for i in range(15):
    t_0=time.clock()
    _X=X[idx, :]
    t_1=time.clock()
    time_l.append(t_1-t_0)
print 'avg= ', (sum(time_l))/15
print 'sd= ', np.std(time_l)

X [idx,:] 的表现差异很大。例如,当n = 1100万时,no_samples = 1000万,d = 50,平均需要大约32秒,标准差为25。

所以有时候它会在4秒内完成,但也有时间超过50秒?怎么会这样? (同样适用于方法np.take())

另外,如果我尝试使用X.T [:,idx],我会收到内存错误,这也让我感到很惊讶。

感谢您的想法!

**更新:我从numpy 1.10升级到1.12,现在表现得更好了。平均值= 6 sd = 2。如果你们中的任何一个人知道更稳定/更快的方式来对行进行二次采样,我很高兴听到它!

1 个答案:

答案 0 :(得分:1)

这部分只回答了您的问题

X n-by-m 随机值数组。值 idx 是要采样的 n 行的数组,其中数组中的值范围从 0 n-1 即可。如果您尝试使用:

X = X.T[idx, :]

n 的值不等于 m ,那么您可能尝试访问的值高于转置数组中包含的值。保证此代码有效的唯一方法是 X 是一个方阵,即 n = m

如果您想要实现的话,此代码会在同一行转置 X

X = X.T[:, idx]

关于代码的时间安排。由于计算机处理器可以执行其他任务,因此长Python代码的执行时间会有很大差异。我从未见过或听说过4s-50s传播同样的任务。您确定4s时间使用的阵列与50s时间相同吗?

-

响应您的更新:两个第二标准偏差肯定可归因于计算机处理器在执行程序时执行其他任务。使用像Windows或Linux这样的操作系统,每次执行代码几乎是不可能的。您几乎必须编写自己的操作系统才能准确确定每次执行的确切时间。 (我怀疑你会想做什么!:D)

相关问题