numpy数组中的列表索引

时间:2014-09-19 22:00:09

标签: python numpy

所以我编写了一个使用精确对角化来研究Lieb-Liniger模型的代码。第一步是构建一个包含描述粒子占用的列表的numpy数组。该数组看起来像

array([[2, 0, 0],
   [1, 1, 0],
   [1, 0, 1],
   [0, 2, 0],
   [0, 1, 1],
   [0, 0, 2]])

对于3种模式中的2个粒子的情况。我的问题是,是否有可能获得此数组中特定列表的索引,类似于使用索引函数获取常规列表中的索引的方式。例如,使用列表A,我能够使用A.index(some_list_in_A)来获取该列表的索引,但我尝试使用numpy.where(HS = [2,0,0])来得到[2,0,0]的指数(依此类推),但无济于事。对于大量的粒子和模式,我正在寻找获得这些索引的有效方法,并且我认为使用numpy数组非常有效,但我刚刚遇到这个块并且没有找到它的解决方案。有什么建议吗?

2 个答案:

答案 0 :(得分:5)

您可以使用np.where()

pattern = [2,0,0]
index = np.where(np.all(a==pattern, axis=1))[0]

答案 1 :(得分:1)

以下是执行此查找的几种方法:

In [36]: A=np.array([[2,0,0],[1,1,0],[1,0,1],[0,2,0],[0,1,1],[0,0,2]])
In [37]: pattern = [0,2,0]

In [38]: np.where(np.all(pattern==A,1))  # Saullo's where
Out[38]: (array([3]),)

In [39]: A.tolist().index(pattern)  # your list find
Out[39]: 3

In [40]: D={tuple(a):i for i,a in enumerate(A.tolist())}  # dictionary
In [41]: D[tuple(pattern)]
Out[41]: 3

我使用元组作为字典键 - 元组是一个不可变列表。

对于这个小尺寸,字典方法是最快的,特别是如果字典可以构建一次并重复使用。即使在运行中构建它也比np.where快。但你应该用更实际的尺寸来测试它。

Python字典针对速度进行了调整,因为它们是语言操作的基础。

使用已编译的代码,np.where中的各个部分都很快。但是,它必须将A的所有元素与pattern进行比较。除了字典哈希查找之外,还有很多工作要做。