我正在编写一个从文本文件中读取数据的代码。我使用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"的任何建议溶液
答案 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])