gpt4 book ai didi

python - 在 numpy 数组中找到人口最多的 "slice"

转载 作者:行者123 更新时间:2023-12-05 08:36:11 24 4
gpt4 key购买 nike

我有一个形状为 [x_len,y_len,z_len] 的 numpy 掩码。我希望找到使 np.count_nonzero(mask[:,:,z]) 最大化的 z。

我天真的解决方案:

best_z = -1
best_score = -1
for z in range(mask.shape[2]):
n_nonzero = np.count_nonzero(mask[:,:,z])

if n_nonzero > best_score:
best_score = n_nonzero
best_z = z

但我正在寻找更快和/或更漂亮的东西。

最佳答案

np.argmax(np.count_nonzero(foo, axis=(0, 1)))

产生最大非零元素的 foo 的 z-index。


为了比较此解决方案与@mcsoini 的解决方案和另一个新颖的解决方案:

foo = np.random.randint(0, 2, size=(100, 100, 200))

# this solution
i> %timeit np.argmax(np.count_nonzero(foo, axis=(0, 1)))
o> 1.58 ms ± 43.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# @mcsoini's solution
i> %timeit np.argmax(np.count_nonzero(foo.reshape(-1, foo.shape[-1]), axis=0))
o> 1.64 ms ± 18.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

# a trick solution
i> %timeit np.argmax(np.sum(foo, axis = (0, 1)))
o> 709 µs ± 4.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

最后一个解决方案花费的时间是其他两个解决方案的一半。我们可以负担得起这个技巧,因为掩码实际上是 01 值的矩阵。如果有其他值,它将不起作用。


进一步评论:

如果 foobool 类型(掩码应该是),那么所有这些方法似乎都需要完全相同的时间(在误差范围内),表明,也许在幕后, bool 值的 count_nonzerosum 非常相似?不过,我不知道,如果有一些见解会很好。

关于python - 在 numpy 数组中找到人口最多的 "slice",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69955369/

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