gpt4 book ai didi

python - Numpy 基于时间的矢量操作,其中前面元素的状态很重要 - for 循环是否合适?

转载 作者:太空狗 更新时间:2023-10-30 02:23:22 25 4
gpt4 key购买 nike

在状态很重要的情况下执行基于时间的计算时,numpy 数组提供了什么。换句话说,序列中较早或较晚发生的事情很重要。

考虑以下基于时间的向量,

TIME = np.array([0.,   10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90.])
FLOW = np.array([100., 75., 60., 20.0, 60.0, 50.0, 20.0, 30.0, 20.0, 10.0])
TEMP = np.array([300., 310., 305., 300., 310., 305., 310., 305., 300., 295.0])

假设一旦 FLOW 低于 30 而不会再次高于 50,TEMP 应该应用指数衰减。在上面的数据中,函数将在上面的 TIME = 60 处应用,TEMP 的最后两个值将是由这个以相应的 TEMP 值开始的辅助函数更新。

需要“向前看”,判断请求<30条件后元素中FLOW是否升到50以上。 numpy 函数似乎并不针对状态很重要的基于时间的向量,传统的嵌套 for 循环方法可能仍然是可行的方法。但是考虑到我对 numpy 的陌生以及我必须执行很多这些类型的基于状态的操作的事实,我将不胜感激指导或肯定。

最佳答案

虽然 Joe Kington 的回答当然是正确的(而且相当灵活),但它比需要的更迂回。对于尝试学习 Numpy 的人来说,我认为更直接的途径可能更容易理解。

正如我在您的问题下所指出的(Joe 也注意到了),您对代码行为的描述与您的示例之间似乎存在不一致。和 Joe 一样,我也假设您描述的是正确的行为。

一些注意事项:

  1. Numpy 可以很好地与过滤器数组配合使用,以指定操作应应用于哪些元素。我多次使用它们。
  2. np.flatnonzero 函数返回一个索引数组,指定给定数组非零(或 True)的位置。

代码使用您提供的示例数组。

import numpy as np

TIME = np.array([0., 10., 20., 30., 40., 50., 60., 70., 80., 90.])
FLOW = np.array([100., 75., 60., 20.0, 60.0, 50.0, 20.0, 30.0, 20.0, 10.0])
TEMP = np.array([300., 310., 305., 300., 310., 305., 310., 305., 300., 295.0])

last_high_flow_index = np.flatnonzero(FLOW > 50)[-1]
low_flow_indices = np.flatnonzero(FLOW < 30)
acceptable_low_flow_indices = low_flow_indices[low_flow_indices > last_high_flow_index]
apply_after_index = acceptable_low_flow_indices[0]

我们现在有了索引,之后函数应该应用于 TEMP。如果我没看错你的问题,你会希望温度在满足你的条件后开始下降。这可以按如下方式完成:

time_delta = TIME[apply_after_index:] - TIME[apply_after_index]
TEMP[apply_after_index:] = TEMP[apply_after_index:] * np.exp(-0.05 * time_delta)

TEMP 已经更新,所以 print TEMP 输出

[ 300.          310.          305.          300.          310.          305.
310. 184.99185121 110.36383235 65.82339724]

或者,您可以通过首先对函数进行矢量化,将任意 Python 函数应用于适当的元素:

def myfunc(x):
''' a normal python function that acts on individual numbers'''
return x + 3

myfunc_v = np.vectorize(myfunc)

然后更新 TEMP 数组:

TEMP[apply_after:] = myfunc_v(TEMP[apply_after:])

关于python - Numpy 基于时间的矢量操作,其中前面元素的状态很重要 - for 循环是否合适?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4359829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com