Python 将操作应用于numpy阵列的不均匀分割部分
我有三个1D 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
t
)t
(y
)中每次发生的测量值列表b
)np.where
在这种情况下没有多大帮助。有没有一种方法可以将我在这里描述的操作矢量化,以避免Pythonfor
循环
顺便说一下,这里有一个
y
vst
,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
vsconcatenate
?而且,这是非常清楚的。我印象深刻。谢谢。另外,我完全不知道reduceat
。它确实能满足我的需要。@madpysicatorr\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