numpy 数组(形状)的值错误

Posted

技术标签:

【中文标题】numpy 数组(形状)的值错误【英文标题】:Value error with numpy arrays (shapes) 【发布时间】:2018-10-04 01:20:34 【问题描述】:

我在使用 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)

我不知道为什么,因为我之前的打印语句基本上是在做同样的事情,y[i] 应该是相同的形状。有谁知道问题出在哪里?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

不知道您的算法试图实现什么,但是您似乎在一次迭代中使用了所有 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

【讨论】:

因为我用的是range而不是np.arange,所以仔细看定义,范围是(0~int(10/h))。

以上是关于numpy 数组(形状)的值错误的主要内容,如果未能解决你的问题,请参考以下文章

将多个 numpy 数组组合成不同形状之一

存储在numpy void中的数组不返回形状/长度

包含具有可变形状的多维 numpy 数组的 numpy 数组

NumPy 填充大型数组的给定边界框坐标内的值

Python Numpy:用另一个数组中的对应值替换一个数组中的值

有效地减去不同形状的numpy数组