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

时间:2016-01-09 22:23:14

标签: 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]

是否有一种不错的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中的变化。

2 个答案:

答案 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]])