Как найти в родительском списке строк, индексы, соответствующие списку дочерних строк
Я пишу код, который считывает данные из текстового файла. Я загружаю данные с помощью numpy loadtxt, и это может выглядеть примерно так:
import numpy as np
Shop_Products = np.array(['Tomatos', 'Bread' , 'Tuna', 'Milk', 'Cheese'])
Shop_Inventory = np.array([12, 6, 10, 7, 8])
Я хочу проверить некоторые из продуктов, которые у меня есть:
Shop_Query = np.array(['Cheese', 'Bread']
Теперь я хотел бы найти эти "элементы" в массиве Shop_Products без выполнения цикла for и если проверки.
Я задавался вопросом, можно ли это сделать с помощью любого из методов numpy: я думал об использовании intercept1d, чтобы найти общие элементы, а затем использовать searchsorted. Однако я не могу сортировать список "Продукты", так как я не хочу потерять исходную сортировку (например, я бы использовал индексы для прямого поиска инвентаря каждого продукта).
Любые советы по "pythonish" решению?
Ответы
Ответ 1
np.searchsorted
может принимать перестановку сортировки в качестве необязательного аргумента:
>>> sorter = np.argsort(Shop_Products)
>>> sorter[np.searchsorted(Shop_Products, Shop_Query, sorter=sorter)]
array([4, 1])
>>> Shop_Inventory[sorter[np.searchsorted(Shop_Products, Shop_Query, sorter=sorter)]]
array([8, 6])
Это, вероятно, быстрее, чем np.in1d
, который также должен сортировать массив. Он также возвращает значения в том же порядке, что и в Shop_Query
, а np.1d
возвращает значения в порядке их появления в Shop_Products
, независимо от порядка в запросе:
>>> np.in1d(Shop_Products, ['Cheese', 'Bread']).nonzero()
(array([1, 4]),)
>>> np.in1d(Shop_Products, ['Bread', 'Cheese']).nonzero()
(array([1, 4]),)
Ответ 2
Вы можете использовать in1d()
и nonzero()
, чтобы найти индексы элементов в Shop_Products
:
>>> np.in1d(Shop_Products, Shop_Query).nonzero()
(array([1, 4]),)
(in1d
возвращает логический массив, указывающий, находится ли элемент во втором списке, nonzero
возвращает индексы значений True
.)
Чтобы найти соответствующие значения в Shop_Inventory
, используйте этот результат для индексации массива:
>>> i = np.in1d(Shop_Products, Shop_Query).nonzero()
>>> Shop_Inventory[i]
array([6, 8])