gpt4 book ai didi

python - 使用 numpy 数组高效索引 numpy 数组

转载 作者:太空宇宙 更新时间:2023-11-03 19:02:34 27 4
gpt4 key购买 nike

我有一个非常(非常、非常)大的二维数组 - 大约有一千列,但有几百万行(足以容纳不下我的 32GB 机器的内存)。我想计算一千列中每一列的方差。一个有帮助的关键事实:我的数据是 8 位无符号整数。

这就是我计划如何解决这个问题。我将首先构造一个名为 counts 的新二维数组,其形状为 (1000, 256),其想法是 counts[i,:] == np.bincount(bigarray[:,i ])。一旦我有了这个数组,计算方差就变得很简单。

问题是,我不确定如何有效地计算它(此计算必须实时运行,并且我希望带宽受到我的 SSD 返回数据的速度的限制)。这是可行的,但速度慢得可怕:

counts = np.array((1000,256))
for row in iterator_over_bigaray_rows():
for i,val in enumerate(row):
counts[i,val] += 1

有什么办法可以让这个运行得更快吗?像这样的事情:

counts = np.array((1000,256))
for row in iterator_over_bigaray_rows():
counts[i,:] = // magic np one-liner to do what I want

最佳答案

我想这就是你想要的:

counts[np.arange(1000), row] += 1
<小时/>

但是,如果您的数组有数百万行,您仍然需要迭代数百万行。以下技巧使我的系统速度提高了近 5 倍:

chunk = np.random.randint(256, size=(1000, 1000))

def count_chunk(chunk):
rows, cols = chunk.shape
col_idx = np.arange(cols) * 256
counts = np.bincount((col_idx[None, :] + chunk).ravel(),
minlength=256*cols)
return counts.reshape(-1, 256)

def count_chunk_by_rows(chunk):
counts = np.zeros(chunk.shape[1:]+(256,), dtype=np.int)
indices = np.arange(chunk.shape[-1])
for row in chunk:
counts[indices, row] += 1
return counts

现在:

In [2]: c = count_chunk_by_rows(chunk)

In [3]: d = count_chunk(chunk)

In [4]: np.all(c == d)
Out[4]: True

In [5]: %timeit count_chunk_by_rows(chunk)
10 loops, best of 3: 80.5 ms per loop

In [6]: %timeit count_chunk(chunk)
100 loops, best of 3: 13.8 ms per loop

关于python - 使用 numpy 数组高效索引 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15668984/

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