IndexError:数组的索引太多 - 总能量矩阵变分法

时间:2016-10-31 18:51:02

标签: python arrays numpy multidimensional-array physics

我正在尝试为总能量(H)定义一个数组,其中以下关系为真:

<我| H | j> = E_j<我| j> = E_j * S [i,j]

和S [i,j]是重叠矩阵的对应元素。我有矩阵E_j,我试图获得矩阵H如下:

H = np.zeros([M])
for n in range (M):
    for m in range(M):
        H[n,m]= E[n]*S[n,m]
print ("H = ")
np.savetxt(sys.stdout, H, fmt= '%7.4f')

这给了我错误消息:“IndexError:数组的索引太多了”

我假设与我试图将一维数组乘以二维数组这一事实有关。不确定是否有解决方法,但感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:0)

H矩阵的初始化不正确。应该如下:

H = np.zeros([M,M])
for n in range (M):
    for m in range(M):
        H[n,m]= E[n]*S[n,m]
print ("H = ")
np.savetxt(sys.stdout, H, fmt= '%7.4f')

答案 1 :(得分:0)

如果您正在使用NumPy数组,我建议您研究矢量化方法以提高性能。在您的情况下,您可以将S转换为E,方法是将单个维度作为第二个维度numpy.newaxis/None引入,然后使用S执行逐元素乘法。这会带来broadcasting,它会将S的所有元素复制到H的形状,这是一个非常有效的操作,然后与H = E[:,None]*S 相乘。

所以,我们会有一个单行来获得H = np.einsum('n,nm->nm',E,S) ,就像这样 -

{{1}}

我们也可以使用np.einsum,这可能看起来非常接近原始的loopy形式,迭代器变形作为字符串,就像这样 -

{{1}}