Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将操作应用于numpy阵列的不均匀分割部分_Python_Numpy_Vectorization - Fatal编程技术网

Python 将操作应用于numpy阵列的不均匀分割部分

Python 将操作应用于numpy阵列的不均匀分割部分,python,numpy,vectorization,Python,Numpy,Vectorization,我有三个1D numpy阵列: 一些测量发生的时间列表(t) 在t(y)中每次发生的测量值列表 影响这些测量的某些外部更改的(较短)时间列表(b) 以下是一个例子: t = np.array([0.33856697, 1.69615293, 1.70257872, 2.32510279, 2.37788203, 2.45102176, 2.87518307, 3.60941650, 3.78275907, 4.3

我有三个1D numpy阵列:

  • 一些测量发生的时间列表(
    t
  • t
    y
    )中每次发生的测量值列表
  • 影响这些测量的某些外部更改的(较短)时间列表(
    b
  • 以下是一个例子:

    t = np.array([0.33856697, 1.69615293, 1.70257872, 2.32510279, 2.37788203, 2.45102176, 2.87518307, 3.60941650, 3.78275907, 4.37970516, 4.56480259, 5.33306546, 6.00867792, 7.40217571, 7.46716989, 7.6791613 , 7.96938078, 8.41620336, 9.17116349, 10.87530965]) y = np.array([ 3.70209916, 6.31148802, 2.96578172, 3.90036915, 5.11728629, 2.85788050, 4.50077811, 4.05113322, 3.55551093, 7.58624384, 5.47249362, 5.00286872, 6.26664832, 7.08640263, 5.28350628, 7.71646500, 3.75513591, 5.72849991, 5.60717179, 3.99436659]) b = np.array([ 1.7, 3.9, 9.5]) 这似乎效率极低。不幸的是,
    np.where
    在这种情况下没有多大帮助。有没有一种方法可以将我在这里描述的操作矢量化,以避免Python
    for
    循环


    顺便说一下,这里有一个
    y
    vs
    t
    bias
    ,以及由
    b
    分隔的区域的图,以显示预期的
    结果是
    数组([False,False,True,False],dtype=bool)

    产生于

    from matplotlib import pyplot as plt
    from matplotlib.patches import Rectangle
    plt.ion()
    f, a = plt.subplots()
    a.plot(t, y, label='y vs t')
    a.hlines(5, *a.get_xlim(), label='bias')
    plt.tight_layout()
    a.set_xlim(0, 11)
    c = np.concatenate([[0], b, [11]])
    for i in range(len(c) - 1):
        a.add_patch(Rectangle((c[i], 2.5), c[i+1] - c[i], 8 - 2.5, alpha=0.2, color=('red' if i % 2 else 'green'), zorder=-i-5))
    a.legend()
    

    这难道不应该产生同样的结果吗

    split_points = np.searchsorted(t, np.r_[t[0], b, t[-1]])
    numerator = np.add.reduceat(y > bias, split_points[:-1])
    denominator = np.diff(split_points)
    result = (numerator / denominator) > 0.5
    
    很少注意:这种方法依赖于t被排序。那么相对于b的箱子都是整洁的块,所以我们不需要遮罩来描述它们,只需要将端点以索引的形式表示为t。这就是
    searchsorted
    为我们找到的

    由于您的标准似乎不依赖于组,我们可以一次性为所有y制作一个大面具。在布尔数组中计算非零与求和是一样的,因为真的将被强制为1等。这种情况下的优点是我们可以使用
    add.reduceat
    ,它获取数组、拆分点列表,然后对拆分之间的块求和,这正是我们想要的


    为了正常化,我们需要计算每个箱子中的总数,但是因为箱子是连续的,我们只需要描述该箱子的分割点的差值,这就是我们使用
    diff

    的地方,因为你的类别是连续的,你不能只使用
    add.reduceat
    对通过与bias比较得到的布尔值进行处理吗?使用拆分点,您可以使用
    searchsorted
    获得最便宜的拆分点?另外,如果我没有完全弄错,您可以使用拆分点的
    diff
    作为您的denominator@PaulPanzer. 请你用一个完整的答案来澄清这一点。我只知道你的目标是什么,但我真的不知道你在具体实现方面的意思。有什么理由让
    r\uu
    vs
    concatenate
    ?而且,这是非常清楚的。我印象深刻。谢谢。另外,我完全不知道
    reduceat
    。它确实能满足我的需要。@madpysicator
    r\uz
    只是我个人的喜好是的
    reduceat
    非常有用不客气只有一个问题:它真的有效吗?因为我没有测试。是的,效果很好。我检查了每一步是否符合我的要求。
    split_points = np.searchsorted(t, np.r_[t[0], b, t[-1]])
    numerator = np.add.reduceat(y > bias, split_points[:-1])
    denominator = np.diff(split_points)
    result = (numerator / denominator) > 0.5