我有一个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]
是否有一种不错的pythonic方式将所有数组值设置为零,不在列表中的有效值将其设置为就地?执行此操作后,列表应如下所示:
[[1,0,0], [0,0,0], [4,1,0], [4,1,0], [0,0,0], ... ]
以下内容在内存中创建数组副本,这对大型数组不利:
arr = np.vectorize(lambda x: x if x in valid else 0)(arr)
它让我感到烦恼,现在我遍历每个数组元素,如果它在valid
列表中,则将其设置为零。
编辑:我发现answer表示没有就地功能来实现这一点。也停止改变我的空白。更容易看到arr
中的变化。
答案 0 :(得分:3)
您可以使用np.place
进行in-situ
更新 -
np.place(arr,~np.in1d(arr,valid),0)
示例运行 -
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]])
同样,np.put
也可以使用 -
np.put(arr,np.where(~np.in1d(arr,valid))[0],0)
示例运行 -
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]])
答案 1 :(得分:1)
使用布尔值进行索引也会起作用:
>>> arr = np.array([[1, 2, 0], [2, 2, 0], [4, 1, 0], [4, 1, 0], [3, 2, 0]])
>>> arr[~np.in1d(arr, valid).reshape(arr.shape)] = 0
>>> arr
array([[1, 0, 0],
[0, 0, 0],
[4, 1, 0],
[4, 1, 0],
[0, 0, 0]])