如何在父字符串列表中查找与子字符串列表对应的索引

时间:2015-04-23 15:56:36

标签: python arrays string numpy indexing

我正在编写一个从文本文件中读取数据的代码。我使用numpy loadtxt加载数据,它看起来像这样:

//aaaa.yyyy.net//Stage[main]/Osx-common/File[/Volumes/share]/owner  owner changed 'root' to 'administrator'
//aaaa.yyyy.net//Stage[main]/Osx-common/File[/Volumes/share]/group  group changed 'wheel' to 'administrator'
//aaaa.yyyy.net//Stage[main]/Osx-common/File[/Volumes/share]/mode   mode changed '0555' to '0777'
//aaaa.yyyy.net//Stage[main]/Osx-common/Mount[/Volumes/share]/options   options changed '0' to ''
//aaaa.yyyy.net//Stage[main]/Osx-common/Mount[/Volumes/share]/pass  defined 'pass' as '0'
//aaaa.yyyy.net//Stage[main]/Osx-common/Mount[/Volumes/share]   Triggered 'refresh' from 2 events

我想检查一下我的产品:

import numpy as np

Shop_Products  = np.array(['Tomatos', 'Bread' , 'Tuna', 'Milk', 'Cheese'])
Shop_Inventory = np.array([12, 6, 10, 7, 8])

现在我想找到这些"项目" Shop_Products数组中的indeces没有执行for循环和检查。

我想知道是否可以使用任何numpy方法:我想使用intercept1d查找常用项目,然后使用searchsorted。但是,我无法对我的"产品"列表因为我不想放弃原始排序(例如我会使用索引直接查找每个产品的库存)。

关于" pythonish"的任何建议溶液

2 个答案:

答案 0 :(得分:5)

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]),) 中出现的顺序返回值,而不管查询中的顺序如何:

when

答案 1 :(得分:3)

您可以使用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])