Python:删除未出现在单独一维列表中的二维数组中的值
我有一个数组,例如:
array = np.array([[0,1,0,0,4,0,5,0,0],
[1,1,1,0,0,0,0,2,2],
[1,1,0,0,3,0,0,2,2],
[0,0,0,0,3,0,0,0,0],
[6,6,0,0,0,0,7,7,7]])
我也有一个列表,例如:
list = [0, 1, 2, 3, 7]
我想删除(设置为零)数组中未出现在列表中的所有值。例如:
newarray = [[0 1 0 0 0 0 0 0 0]
[1 1 1 0 0 0 0 2 2]
[1 1 0 0 3 0 0 2 2]
[0 0 0 0 3 0 0 0 0]
[0 0 0 0 0 0 7 7 7]
这里,数组中的 4s、5s 和 6s 已被 0 替换,因为它们没有出现在列表中。我当前的解决方案在循环中使用 np.where() 删除数组中未出现在列表中的所有值的速度非常慢:
# get all unique values in array
unique_vals_in_array = np.unique(array)
# get all values in array that don't appear in list
vals_not_in_array = set(unique_vals_in_array) - set(list)
# On each loop, replace the values that do not appear in list with zero
for i in vals_not_in_array:
new_array = np.where(array==i,0,array)
如果有人有更高效的 Pythonic 解决方案,我将不胜感激。
回答
为什么不只是遍历列表并将值添加回结果数组?
result = np.zeros_like(array)
for to_keep in [0, 1, 2, 3, 7]:
result[array==to_keep] = to_keep