Python 将数组与二维数组一起排序
所以我用NumPy的线性代数例程来做一些基本的计算量子力学。假设我有一个矩阵,哈密顿量,我想要它的特征值和特征向量Python 将数组与二维数组一起排序,python,arrays,sorting,numpy,Python,Arrays,Sorting,Numpy,所以我用NumPy的线性代数例程来做一些基本的计算量子力学。假设我有一个矩阵,哈密顿量,我想要它的特征值和特征向量 import numpy as np from numpy import linalg as la hamiltonian = np.zeros((N, N)) # N is some constant I have defined # fill up hamiltonian here energies, states = la.eig(hamiltonian) 现在,我想按递
import numpy as np
from numpy import linalg as la
hamiltonian = np.zeros((N, N)) # N is some constant I have defined
# fill up hamiltonian here
energies, states = la.eig(hamiltonian)
现在,我想按递增的顺序对能量进行排序,我想对状态进行排序。例如,如果我这样做:
groundStateEnergy = min(energies)
groundStateIndex = np.where(energies == groundStateEnergy)
groundState = states[groundStateIndex, :]
我正确地绘制了基态(具有最低本征值的本征向量)。但是,如果我尝试这样的方法:
energies, states = zip(*sorted(zip(energies, states)))
甚至
energies, states = zip(*sorted(zip(energies, states), key = lambda pair:pair[0])))
以同样的方式绘制不再绘制正确的状态。那么我如何才能将状态与能量一起排序,而只能按行排序?(也就是说,我想将每一行状态与一个能量值相关联,并且我想重新排列这些行,使这些行的顺序与能量值的排序相对应)您可以使用
argsort
,如下所示:
>>> x = np.random.random((1,10))
>>> x
array([ 0.69719108, 0.75828237, 0.79944838, 0.68245968, 0.36232211,
0.46565445, 0.76552493, 0.94967472, 0.43531813, 0.22913607])
>>> y = np.random.random((10))
>>> y
array([ 0.64332275, 0.34984653, 0.55240204, 0.31019789, 0.96354724,
0.76723872, 0.25721343, 0.51629662, 0.13096252, 0.86220311])
>>> idx = np.argsort(x)
>>> idx
array([9, 4, 8, 5, 3, 0, 1, 6, 2, 7])
>>> xsorted= x[idx]
>>> xsorted
array([ 0.22913607, 0.36232211, 0.43531813, 0.46565445, 0.68245968,
0.69719108, 0.75828237, 0.76552493, 0.79944838, 0.94967472])
>>> ysordedbyx = y[idx]
>>> ysordedbyx
array([ 0.86220311, 0.96354724, 0.13096252, 0.76723872, 0.31019789,
0.64332275, 0.34984653, 0.25721343, 0.55240204, 0.51629662])
正如评论中所建议的,在一个示例中,我们按照2d数组的第一个字符对其进行排序
>>> x=np.random.random((10,2))
>>> x
array([[ 0.72789275, 0.29404982],
[ 0.05149693, 0.24411234],
[ 0.34863983, 0.58950756],
[ 0.81916424, 0.32032827],
[ 0.52958012, 0.00417253],
[ 0.41587698, 0.32733306],
[ 0.79918377, 0.18465189],
[ 0.678948 , 0.55039723],
[ 0.8287709 , 0.54735691],
[ 0.74044999, 0.70688683]])
>>> idx = np.argsort(x[:,0])
>>> idx
array([1, 2, 5, 4, 7, 0, 9, 6, 3, 8])
>>> xsorted = x[idx,:]
>>> xsorted
array([[ 0.05149693, 0.24411234],
[ 0.34863983, 0.58950756],
[ 0.41587698, 0.32733306],
[ 0.52958012, 0.00417253],
[ 0.678948 , 0.55039723],
[ 0.72789275, 0.29404982],
[ 0.74044999, 0.70688683],
[ 0.79918377, 0.18465189],
[ 0.81916424, 0.32032827],
[ 0.8287709 , 0.54735691]])
您可能应该检查使用
numpy.argsort(energies)
中的索引来对状态数组进行排序。因此,一旦我从numpy.argsort(energies)中获得索引,我如何仅使用它们重新排列状态行?一旦有了对数组进行排序的索引,就使用np.take()
这显示出比花哨的索引更快…答案是正确的,但在OP的例子中,y
是二维的。最好给出一个在二维数组上使用idx
的例子。@SaulloCastro使用take
可能会更快,但在numpy 1.9中,花式索引的性能已经得到了很大的改进,所以这个小技巧可能不再值得。对于任何较旧的版本,是的,绝对是,速度从2倍到10倍不等,非常值得。@Jaime感谢您的更新,NumPy的改进令人惊讶!