所以我编写了一个使用精确对角化来研究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数组非常有效,但我刚刚遇到这个块并且没有找到它的解决方案。有什么建议吗?
答案 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
进行比较。除了字典哈希查找之外,还有很多工作要做。