首页 > 解决方案 > 绘制波函数:TypeError:只有大小为 1 的数组可以转换为 Python 标量

问题描述

我想计算电子的波函数。因此,我编写了以下代码:

import cmath
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(- np.pi, np.pi, 100, endpoint=True)
t = 0

def Wavefunction(x,t):
    return np.abs(cmath.exp(-1j*t)*cmath.cos(x)+cmath.exp(1j*t)*cmath.sin(x))**2

Amplitude =  np.vectorize(Wavefunction(x,t))
plt.plot(x, Wahrscheinlichkeit(x,t))
plt.show

启动程序时显示以下错误TypeError: Only Size-1 Arrays Can be Converted to Python Scalars。我已经看到 np.vectorize()应该可以解决问题,但对我来说,它没有用。

谢谢您的帮助。PS:请不要害怕这个奇怪的波函数

标签: python

解决方案


你很接近:np.vectorize将函数作为参数。因此正确的代码是:

import cmath
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(- np.pi, np.pi, 100, endpoint=True)
t = 0

def Wavefunction(x,t):
    return np.abs(cmath.exp(-1j*t)*cmath.cos(x)+cmath.exp(1j*t)*cmath.sin(x))**2

Amplitude =  np.vectorize(Wavefunction)
plt.plot(x, Wahrscheinlichkeit(x,t))
plt.show()

很多时候,np.vectorize等效地用作装饰器:

import cmath
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(- np.pi, np.pi, 100, endpoint=True)
t = 0

@np.vectorize
def Wavefunction(x,t):
    return np.abs(cmath.exp(-1j*t)*cmath.cos(x)+cmath.exp(1j*t)*cmath.sin(x))**2


plt.plot(x, Wahrscheinlichkeit(x,t))
plt.show()

由于您试图调用Wavefunction(x,t),它会在将其传递给np.vectorize. 这就是为什么你得到同样的错误。


推荐阅读