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
它们的变化.
您可以用于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)