tbr*_*ere 3 python arrays indexing numpy
好吧,假设我有一个 numpy 数组arr和一个形状相同的布尔数组mask(例如mask = arr >= 20)
我想要一个包含arrwhere maskis的所有值的数组True。我并不关心订单(我将在之后计算其总和)
根据我从numpy 文档收集的信息,我可以使用布尔索引:
\narr[mask]\nRun Code Online (Sandbox Code Playgroud)\n尽管如此,在互联网上,我看到了很多类似\xe2\x80\xaf的代码:
\narr[np.where(mask)]\nRun Code Online (Sandbox Code Playgroud)\n我认为,它的作用相同,但使用索引数组。
\n这两行真的做同样的事情\xe2\x80\xaf 吗?如果是的话,其中之一是否更快\xe2\x80\xaf?
\n至于性能:为什么不简单地衡量它呢?举个简单的例子:
\nIn [11]: y = np.arange(35).reshape(5,7)\n\nIn [12]: mask = (y % 2 == 0)\n\nIn [13]: mask\nOut[13]:\narray([[ True, False, True, False, True, False, True],\n [False, True, False, True, False, True, False],\n [ True, False, True, False, True, False, True],\n [False, True, False, True, False, True, False],\n [ True, False, True, False, True, False, True]])\nRun Code Online (Sandbox Code Playgroud)\n然后%timeit:
In [14]: %timeit y[mask]\n534 ns \xc2\xb1 1.61 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000000 loops each)\n\nIn [15]: %timeit y[np.where(mask)]\n2.18 \xc2\xb5s \xc2\xb1 16.7 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000 loops each)\nRun Code Online (Sandbox Code Playgroud)\n毫不奇怪 - 即使两条线之间没有功能差异 - 函数调用开销也会np.where变慢。至于“它们是否相同”?不完全是。来自np.where文档字符串:
\n\n\n
where(condition, [x, y]):\n返回选自x或y依赖于 的元素condition。注意:当提供 only 时
\ncondition,此函数是 \n 的简写np.asarray(condition).nonzero()。直接使用nonzero应该是首选,因为它对于子类的行为是正确的。本文档的其余部分仅涵盖提供所有三个参数的情况。
回顾一下例子:
\n虽然y[mask] 直接选择 的所有匹配 ( True) 元素y,但np.where(mask)绕道计算Truemask 中元素的所有(此处为 2D)索引位置:
In [26]: np.where(mask)\nOut[26]:\n(array([0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4], dtype=int64),\n array([0, 2, 4, 6, 1, 3, 5, 0, 2, 4, 6, 1, 3, 5, 0, 2, 4, 6], dtype=int64))\nRun Code Online (Sandbox Code Playgroud)\n换句话说:直接使用布尔掩码不仅更简单,而且避免了大量额外的计算。
\n| 归档时间: |
|
| 查看次数: |
1457 次 |
| 最近记录: |