【发布时间】:2017-03-07 13:50:28
【问题描述】:
我想知道如何从高维 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 标准差 = 2。如果你们中的任何人知道对行进行二次采样的更稳定/更快的方法,我很高兴听到它!
【问题讨论】:
-
什么是
no_samples? -
对不起!我采样的行数。在我的示例中,我对所有这些都进行了采样,因此 no_samples=n=1100 万
-
如果“replace=False”,“no_samples”必须小于“n”。否则,您只是对原始数组进行洗牌,而不是对其进行采样。
-
no_samples使用了什么值?我假设您在这些测试中使用相同的值。 -
是的,我用一个简单的 for 循环解决了这个问题,所以 no_samples=const。这是渐近查看所有数据点的算法的一部分。这就是我使用 no_samples=n 的原因,但是对于任何值
标签: python arrays performance numpy sampling