【问题标题】:Incorrect use of np.where不正确使用 np.where
【发布时间】:2018-06-04 18:08:33
【问题描述】:

所以我试图通过使用两个步长来计算错误,一个是另一个的两倍。我设置了两个温度阵列,它们使用两种不同的步长进行计算。当我注意到在我调用它以在时间 = 5 分钟时打印温度值的循环中,我为我的错误得到了疯狂的值,我写错了。如果我用它代替任何数字,它会打印相同的值。 np.where(t=5) 在这种情况下被错误地使用了吗?对于每个不同的步长,都会产生一条曲线,该曲线具有与每个时间对应的温度值。我希望能够打印时间步长的值及其相应的错误。

for j in dt_values:
    t = np.arange(0,100,j) #time
    te = np.zeros(len(t)) #temperature array
    te[0] = te_init 
    te2 = np.zeros(len(t)) #second temp array
    te2[0] = te_init
    dt = j #timestep
    dt2 = 2*dt 
    def f(t,te):
        y = -r*(te - te_surr) # y is the derivative
        return y
    for i in range(1,len(t)): #eulers method for computing temperature 
        p1=f(t[i-1], te[i-1])
        p2 =f(t[i], te[i-1]+dt*p1)
        te[i] = te[i-1] + (p1 + p2)*(dt/2) 
        r1=f(t[i-1], te[i-1])
        r2 =f(t[i], te[i-1]+dt2*p1)
        te2[i] = te2[i-1] + (r1 + r2)*(dt2/2) 
    if np.where(t == 5): 
        print j
        print te[i] - te2[i]

【问题讨论】:

  • 确实不正确。只需使用if (t == 5).any()

标签: python arrays python-2.7 numpy


【解决方案1】:

首先,循环遍历由dt 隔开的相同温度,然后将dt 加倍是没有意义的。与尝试in your previous post 的分析解决方案进行比较更有意义。

要在某个温度下打印结果值,您可以(在您知道该值实际上在数组内部的条件下)按条件索引数组。

例如

t = np.array([1,55,77])
x = np.array([1,2,3])
print x[t == 55]

在这种情况下:

import numpy as np 

r = 0.024 #cooling rate per minute
te_init = 90.0
te_surr = 17

def f(te):
    return -r*(te - te_surr) # the derivative

dt_values = [0.05, 0.025, 0.01, 0.005]

for dt in dt_values:
    t = np.arange(0,100,dt) #time
    te = np.zeros(len(t)) #temperature array
    te[0] = te_init 

    for i in range(1,len(t)): #eulers method for computing temperature 
        p1=f(te[i-1])
        p2 =f(te[i-1]+dt*p1)
        te[i] = te[i-1] + (p1 + p2)*(dt/2) 
        te_ana = te_surr - (te_surr - te_init)*np.exp(-r*t)

    print dt, 
    print te[t==10] - te_ana[t==10]

【讨论】:

  • 双时间步的使用应该是时间步“准确度”的指示。如果将其翻倍会导致截然不同的答案,则需要使用更小的时间步长。
  • 当然,但是你不能用小的时间步长循环数组然后加倍时间步长来完成这个,因为差异总是大约 te[i]-te[i-1],不无论您使用什么时间步长。
  • 我应该使用两个完全独立的循环来计算 te[i] 和 te2[i]?
  • 是的,这就是你正在做的事情。例如。在上面的例子中,0.050.025 的两倍。
  • VisibleDeprecationWarning:布尔索引与维度 0 上的索引数组不匹配;维度是 2000,但对应的布尔维度是 3960。当我尝试使用两个单独的循环时会发生这种情况。
猜你喜欢
  • 2020-11-14
  • 2019-03-10
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多