我正在尝试为总能量(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:数组的索引太多了”
我假设与我试图将一维数组乘以二维数组这一事实有关。不确定是否有解决方法,但感谢任何帮助。
谢谢!
答案 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}}