【问题标题】:Sampling rows from numpy array efficiently有效地从 numpy 数组中采样行
【发布时间】: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


【解决方案1】:

仅此部分回答您的问题

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

X = X.T[idx, :]

如果 n 的值不等于 m,那么您可能会尝试访问比转置数组中包含的值更高的行的值。保证此代码工作的唯一方法是当 X 是方阵时,即 n=m

如果这是您想要实现的目标,此代码会将 X 转置在同一行:

X = X.T[:, idx]

关于代码的时序。由于计算机处理器可以执行其他任务,长 Python 代码的执行时间可能会有很大差异。我从来没有见过或听说过 4s-50s 可以完成相同的任务。你确定你4s时间用的数组和50s时间是一样的吗?

--

响应您的更新: 2 秒的标准偏差绝对可以归因于计算机的处理器在程序执行时执行其他任务。使用 Windows 或 Linux 等操作系统几乎不可能每次执行代码都获得相同的时间。您几乎必须编写自己的操作系统才能获得每次执行的准确时间。 (我怀疑你会想要这样做!:D)

【讨论】:

  • 是的,关于转置的索引你是对的。是的,一切都保持不变,我没有并行运行其他任何东西。我在上面发布了整个代码。我也很惊讶,这就是我问这个问题的原因!
猜你喜欢
  • 2017-12-07
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 2013-12-17
  • 1970-01-01
相关资源
最近更新 更多