gpt4 book ai didi

python - 通过无循环的 bool 索引数组的 bool 索引数组

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:38 24 4
gpt4 key购买 nike

我想在没有循环的情况下通过多个 bool 数组索引一个带有 bool 掩码的数组。

这就是我想要实现的,但没有循环,只有 numpy。

import numpy as np
a = np.array([[0, 1],[2, 3]])
b = np.array([[[1, 0], [1, 0]], [[0, 0], [1, 1]]], dtype=bool)

r = []
for x in b:
print(a[x])
r.extend(a[x])

# => array([0, 2])
# => array([2, 3])

print(r)
# => [0, 2, 2, 3]

# what I would like to do is something like this
r = some_fancy_indexing_magic_with_b_and_a
print(r)
# => [0, 2, 2, 3]

最佳答案

方法 #1

使用np.broadcast_to 简单地将a 广播到b 的形状|然后用 b -

屏蔽它
In [15]: np.broadcast_to(a,b.shape)[b]
Out[15]: array([0, 2, 2, 3])

方法 #2

另一种方法是获取所有索引并根据 a 的大小对它们进行mod,这也是每个 2D block 的大小在 b 中,然后索引到扁平化的 a -

a.ravel()[np.flatnonzero(b)%a.size]

方法 #3

与 App#2 在同一行,但保持 2D 格式并沿 b 的最后两个轴使用非零索引 -

_,r,c = np.nonzero(b)
out = a[r,c]

大型阵列上的时间(给定样本形状放大 100 倍)-

In [50]: np.random.seed(0)
...: a = np.random.rand(200,200)
...: b = np.random.rand(200,200,200)>0.5

In [51]: %timeit np.broadcast_to(a,b.shape)[b]
45.5 ms ± 381 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [52]: %timeit a.ravel()[np.flatnonzero(b)%a.size]
94.6 ms ± 1.64 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [53]: %%timeit
...: _,r,c = np.nonzero(b)
...: out = a[r,c]
128 ms ± 1.46 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

关于python - 通过无循环的 bool 索引数组的 bool 索引数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56582064/

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