替换数组中值的最快方法

时间:2018-08-21 15:05:20

标签: python arrays numpy

我有2个数组,如下所示:

l=
array([[1205, 1420, 1340],
       [1306, 1530, 1045],
       [2001, 135, 1207],
               ...]])

y= 
array([[1200, 1320, 2001],
       [1306, 1530, 1045],
              ...,
       [  0,   3,   0]])

我想找到最快的方法,用[1000,1000,1000]替换y中的l中的值(子数组)。

例如,我会得到:

 l=
array([[1205, 1420, 1340],
   [1000, 1000, 1000],
   [2001, 135, 1207],
           ...]])

到目前为止,我已经尝试了使用'if'条件的'for'循环,但这需要太多时间。

感谢您的建议。

1 个答案:

答案 0 :(得分:4)

我们可以使用views将每一行视为一个元素,然后使用np.isin获得 presence 的布尔数组,用它来索引并最终分配-< / p>

# https://stackoverflow.com/a/45313353/ @Divakar
def view1D(a, b): # a, b are arrays
    a = np.ascontiguousarray(a)
    b = np.ascontiguousarray(b)
    void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
    return a.view(void_dt).ravel(),  b.view(void_dt).ravel()

l1D,y1D = view1D(l,y)
l[np.isin(l1D, y1D)] = [1000,1000,1000]

样品运行-

In [36]: l
Out[36]: 
array([[1205, 1420, 1340],
       [1306, 1530, 1045],
       [2001,  135, 1207],
       [   2,    3,    4]])

In [37]: y
Out[37]: 
array([[1200, 1320, 2001],
       [1306, 1530, 1045],
       [   0,    3,    0]])

In [38]: l1D,y1D = view1D(l,y)

In [39]: l[np.isin(l1D, y1D)] = [1000,1000,1000]

In [40]: l
Out[40]: 
array([[1205, 1420, 1340],
       [1000, 1000, 1000],
       [2001,  135, 1207],
       [   2,    3,    4]])