numpy交换数组中的多个元素

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.有更优雅/有效的方法吗?

tim*_*geb 2

给定

\n\n
>>> a\narray([[1, 0, 0, 1],\n       [1, 1, 1, 0]])\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以使用numpy.where

\n\n
>>> np.where(a == 0, 1, 0) # read as (if, then, else)\narray([[0, 1, 1, 0],\n       [0, 0, 0, 1]])\n
Run Code Online (Sandbox Code Playgroud)\n\n

...或者否定a并进行一些类型转换。

\n\n
>>> (~a.astype(bool)).astype(int)\narray([[0, 1, 1, 0],\n       [0, 0, 0, 1]])\n
Run 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)\n
Run 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)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的看法:a^1干净1 - a、优雅、快速。使用np.where适用于您可能想要交换的任何值。

\n