如何根据条件在`np.array()`中设置单元格值?

con*_*use 5 python arrays numpy

我有一个numpy数组和该数组中的有效值列表:

import numpy as np
arr = np.array([[1,2,0], [2,2,0], [4,1,0], [4,1,0], [3,2,0], ... ])
valid = [1,4]
Run Code Online (Sandbox Code Playgroud)

是否有一种很好的pythonic方法可以将所有数组值设置为零,这些方法不在有效值列表中并就地执行?执行此操作后,列表应如下所示:

               [[1,0,0], [0,0,0], [4,1,0], [4,1,0], [0,0,0], ... ]
Run Code Online (Sandbox Code Playgroud)

以下内容在内存中创建了一个数组副本,这对大型数组不利:

arr = np.vectorize(lambda x: x if x in valid else 0)(arr)
Run Code Online (Sandbox Code Playgroud)

它让我烦恼,现在我遍历每个数组元素并将其设置为零(如果它在valid列表中).

编辑:我找到了一个答案,表明没有就地功能来实现这一目标.也停止改变我的空白.更容易看到arr它们的变化.

Div*_*kar 3

您可以用于np.place更新in-situ-

np.place(arr,~np.in1d(arr,valid),0)
Run Code Online (Sandbox Code Playgroud)

样本运行 -

In [66]: arr
Out[66]: 
array([[1, 2, 0],
       [2, 2, 0],
       [4, 1, 0],
       [4, 1, 0],
       [3, 2, 0]])

In [67]: np.place(arr,~np.in1d(arr,valid),0)

In [68]: arr
Out[68]: 
array([[1, 0, 0],
       [0, 0, 0],
       [4, 1, 0],
       [4, 1, 0],
       [0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)

同样,np.put也可以使用 -

np.put(arr,np.where(~np.in1d(arr,valid))[0],0)
Run Code Online (Sandbox Code Playgroud)

样本运行 -

In [70]: arr
Out[70]: 
array([[1, 2, 0],
       [2, 2, 0],
       [4, 1, 0],
       [4, 1, 0],
       [3, 2, 0]])

In [71]: np.put(arr,np.where(~np.in1d(arr,valid))[0],0)

In [72]: arr
Out[72]: 
array([[1, 0, 0],
       [0, 0, 0],
       [4, 1, 0],
       [4, 1, 0],
       [0, 0, 0]])
Run Code Online (Sandbox Code Playgroud)