numpy 数组(形状)的值错误
Value error with numpy arrays (shapes)
我在使用 numpy 数组时不断收到 ValueError,我不知道是什么原因造成的,因为它似乎在我的 for 循环之外正常工作。这是我的代码:
import numpy as np
def x(t, x_0, w):
return x_0*np.cos(w*t)
def x_prime(t, x_0, w):
return -x_0*w*np.sin(w*t)
w = 1
x_0 = 1
h = 0.001
t = np.arange(0, 10, h)
y = np.array([[0, 0]]*len(t))
y[0] = [x_0, 0]
# The line below works correctly, but not inside my loop
print np.array([x_prime(1, x_0, w), -w**2 * x(1, x_0, w)])*h + y[0]
for i in range(1, len(t)):
# Euler's method
y[i] = y[i-1] + np.array([x_prime(t, x_0, w), -w**2 * x(t, x_0, w)]) * h
从 print
行我得到这个输出:[ 9.99158529e-01 -5.40302306e-04]
,所以它似乎工作正常。但是,我在 y[i]
行收到此错误:
ValueError: operands could not be broadcast together with shapes (2,) (2,10000)
我不知道为什么,因为我之前的 print 语句基本上是做同样的事情,y[i]
应该是相同的形状。有人知道问题出在哪里吗?
在 print
行中,x()
/x_prime()
的第一个参数是一个标量 (1
)。
在 y[i]
行中,您传递了 t
,这是一个 10000 个元素的数组,导致 np.array([x_prime(t, x_0, w), -w**2 * x(t, x_0, w)])
是一个 (2,10000) 矩阵,因此 ValueError
.
也许您想做的是:
y[i] = y[i-1] + np.array([x_prime(t[i], x_0, w), -w**2 * x(t[i], x_0, w)]) * h
不知道你的算法试图实现什么,但你似乎在一次迭代中使用了所有的 t,也许我的改变可以帮助你。
将 numpy 导入为 np
def x(t, x_0, w):
return x_0*np.cos(w*t)
def x_prime(t, x_0, w):
return -x_0*w*np.sin(w*t)
w = 1
x_0 = 1
h = 0.001
t = range(0, int(10/h))
y = np.array([[0, 0]]*len(t))
y[0,0] = x_0
y[0,1] = 0
# The line below works correctly, but not inside my loop
print(np.array([x_prime(1, x_0, w), -w**2 * x(1, x_0, w)])*h + y[0])
for i in range(1, len(t)):
# Euler's method
y[i] = y[i-1] + np.array([x_prime(t[i]*h, x_0, w), -w**2 * x(t[i]*h, x_0, w)]) * h
我在使用 numpy 数组时不断收到 ValueError,我不知道是什么原因造成的,因为它似乎在我的 for 循环之外正常工作。这是我的代码:
import numpy as np
def x(t, x_0, w):
return x_0*np.cos(w*t)
def x_prime(t, x_0, w):
return -x_0*w*np.sin(w*t)
w = 1
x_0 = 1
h = 0.001
t = np.arange(0, 10, h)
y = np.array([[0, 0]]*len(t))
y[0] = [x_0, 0]
# The line below works correctly, but not inside my loop
print np.array([x_prime(1, x_0, w), -w**2 * x(1, x_0, w)])*h + y[0]
for i in range(1, len(t)):
# Euler's method
y[i] = y[i-1] + np.array([x_prime(t, x_0, w), -w**2 * x(t, x_0, w)]) * h
从 print
行我得到这个输出:[ 9.99158529e-01 -5.40302306e-04]
,所以它似乎工作正常。但是,我在 y[i]
行收到此错误:
ValueError: operands could not be broadcast together with shapes (2,) (2,10000)
我不知道为什么,因为我之前的 print 语句基本上是做同样的事情,y[i]
应该是相同的形状。有人知道问题出在哪里吗?
在 print
行中,x()
/x_prime()
的第一个参数是一个标量 (1
)。
在 y[i]
行中,您传递了 t
,这是一个 10000 个元素的数组,导致 np.array([x_prime(t, x_0, w), -w**2 * x(t, x_0, w)])
是一个 (2,10000) 矩阵,因此 ValueError
.
也许您想做的是:
y[i] = y[i-1] + np.array([x_prime(t[i], x_0, w), -w**2 * x(t[i], x_0, w)]) * h
不知道你的算法试图实现什么,但你似乎在一次迭代中使用了所有的 t,也许我的改变可以帮助你。 将 numpy 导入为 np
def x(t, x_0, w):
return x_0*np.cos(w*t)
def x_prime(t, x_0, w):
return -x_0*w*np.sin(w*t)
w = 1
x_0 = 1
h = 0.001
t = range(0, int(10/h))
y = np.array([[0, 0]]*len(t))
y[0,0] = x_0
y[0,1] = 0
# The line below works correctly, but not inside my loop
print(np.array([x_prime(1, x_0, w), -w**2 * x(1, x_0, w)])*h + y[0])
for i in range(1, len(t)):
# Euler's method
y[i] = y[i-1] + np.array([x_prime(t[i]*h, x_0, w), -w**2 * x(t[i]*h, x_0, w)]) * h