简体   繁体   中英

Fastest way to replace values in array

I have 2 arrays as follow:

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

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

I would like to find the fastest way to replace values (the sub arrays) in l that are in y by [1000,1000,1000].

for example I would get:

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

So far I've tried a 'for' loop with 'if' condition but it takes too much time.

Thanks for your suggestions.

We could use views to view each row as one element, then use np.isin to get a boolean array of presence , use it to index and finally assign -

# 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]

Sample run -

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM