Найти индексы строк 2d-массива numpy в другом 2D-массиве

#numpy #numpy-ndarray

#тупой #numpy-ndarray

Вопрос:

Я новичок в numpy. У меня есть 2 2d-массива. Я хотел бы найти индексы arr2 в arr1. Пожалуйста, посоветуйте мне.

     arr1 = [[1, 2, 3],
            [4, 5, 6],
            [7, 8, 9],
            [4, 5, 6],
            [1, 2, 3]]

    arr2 = [[1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]]
    
    desired_output = [0, 1, 2, 1, 0]
 

Ответ №1:

Один из способов добиться этого.

Если какая-либо строка arr1 не была найдена в arr2 , то в этом месте in pos будет иметь значение -1 для простоты.

При этом в значительной степени используются numpy-трансляция и индексация. Не стесняйтесь обращаться за дальнейшими разъяснениями.

Оригинальный пример:

 import numpy as np
arr1 = np.array([[1, 2, 3],
                 [4, 5, 6],
                 [7, 8, 9],
                 [4, 5, 6],
                 [1, 2, 3]])
arr2 = np.array([[1, 2, 3],
                 [4, 5, 6],
                 [7, 8, 9]])

inds = arr1 == arr2[:, None]
row_sums = inds.sum(axis = 2)
i, j = np.where(row_sums == 3) # Check which rows match in all 3 columns

pos = np.ones(arr1.shape[0], dtype = 'int64') * -1
pos[j] = i
pos
 
 array([0, 1, 2, 1, 0])
 

Пример 2:

 import numpy as np
arr1 = np.array([[1, 2, 4],
                 [4, 5, 6],
                 [7, 8, 9],
                 [4, 1, 6],
                 [1, 2, 3]])
arr2 = np.array([[1, 2, 3],
                 [4, 5, 6],
                 [7, 8, 9]])

inds = arr1 == arr2[:, None]
row_sums = inds.sum(axis = 2)
i, j = np.where(row_sums == 3)

pos = np.ones(arr1.shape[0], dtype = 'int64') * -1
pos[j] = i
pos
 
 array([-1,  1,  2, -1,  0])
 

Если у вас больше столбцов, просто измените строку i, j = np.where(row_sums == 3) на i, j = np.where(row_sums == arr1.shape[1]) .

Комментарии:

1. Большое вам спасибо, это именно то, что мне нужно

2. Вау, столько гениальности. Большое спасибо, @swag2198!!