Leg*_*tro 5 python arrays numpy
我有一个numpy数组,包含1和0的随机扩散.我想用0替换所有1,用1替换所有0.
arr[arr == 0] = 2
arr[arr== 1] = 0
arr[arr== 2] = 1
Run Code Online (Sandbox Code Playgroud)
我目前不得不使用临时值(在这种情况下为2),以避免所有0变为1,然后使整个数组充满0.有更优雅/有效的方法吗?
给定
\n\n>>> a\narray([[1, 0, 0, 1],\n [1, 1, 1, 0]])\nRun Code Online (Sandbox Code Playgroud)\n\n您可以使用numpy.where
>>> np.where(a == 0, 1, 0) # read as (if, then, else)\narray([[0, 1, 1, 0],\n [0, 0, 0, 1]])\nRun Code Online (Sandbox Code Playgroud)\n\n...或者否定a并进行一些类型转换。
>>> (~a.astype(bool)).astype(int)\narray([[0, 1, 1, 0],\n [0, 0, 0, 1]])\nRun Code Online (Sandbox Code Playgroud)\n\n(IPython) 时间安排:差别不大。
\n\n>>> a = np.eye(1000, dtype=int)\n>>> %timeit np.where(a == 0, 1, 0)\n1.56 ms \xc2\xb1 2.4 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\n>>> %timeit (~a.astype(bool)).astype(int)\n1.74 ms \xc2\xb1 87.3 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\nRun Code Online (Sandbox Code Playgroud)\n\n其他人的回答时间:
\n\n>>> %timeit a^1 # Tls Chris\n920 \xc2\xb5s \xc2\xb1 31.8 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\n>>> %timeit np.array([1, 0])[a] # Tls Chris\n1.4 ms \xc2\xb1 102 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\n>>> %timeit (a - 1)*-1 # sacul\n1.57 ms \xc2\xb1 13.8 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\n>>> %timeit 1 - a # user3483203\n905 \xc2\xb5s \xc2\xb1 2.16 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\nRun Code Online (Sandbox Code Playgroud)\n\n我的看法:a^1干净1 - a、优雅、快速。使用np.where适用于您可能想要交换的任何值。