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