gpt4 book ai didi

python - 基于二维 numpy 数组中的索引列表访问行的更有效方法?

转载 作者:行者123 更新时间:2023-12-03 19:07:37 25 4
gpt4 key购买 nike

所以我有 2d numpay 数组 arr。这是一个比较大的:arr.shape = (2400, 60000)我目前正在做的是以下内容:

  • 随机(带替换)选择 arr.shape[0]指数
  • 访问(按行)选择的索引 arr
  • 计算列平均值并选择最大值
  • 我重复了 k 次

  • 它看起来像:
    no_rows = arr.shape[0]
    indicies = np.array(range(no_rows))
    my_vals = []
    for k in range(no_samples):
    random_idxs = np.random.choice(indicies, size=no_rows, replace=True)
    my_vals.append(
    arr[random_idxs].mean(axis=0).max()
    )
    我的问题是速度很慢。用我的 arr大小,1 个循环需要大约 3 秒。因为我想要一个大于 1k 的样本 - 我当前的解决方案非常糟糕(1k*~3s -> ~1h)。我已经对其进行了分析,瓶颈是基于索引访问行。 "mean""max"工作 fast. np.random.choice还可以。
    你看到任何需要改进的地方吗?一种更有效的访问索引的方法,或者更好的更快的方法来解决这个问题?
    到目前为止我尝试过的:
  • numpy.take(较慢)
  • numpy.ravel:

  • 类似于:
    random_idxs = np.random.choice(sample_idxs, size=sample_size, replace=True) 
    test = random_idxs.ravel()[arr.ravel()].reshape(arr.shape)
  • 与当前方法类似,但没有循环。我一次性创建了 3d arr 并访问了跨其他维度的行
  • 最佳答案

    advanced indexing会生成一个副本,程序会在arr[random_idxs]中分配巨大的内存.
    因此,提高效率的最简单方法之一就是批量处理。

    BATCH = 512
    max(arr[random_idxs,i:i+BATCH].mean(axis=0).max() for i in range(0,arr.shape[1],BATCH))

    关于python - 基于二维 numpy 数组中的索引列表访问行的更有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63168530/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com