【发布时间】:2022-01-14 17:27:35
【问题描述】:
是否有一种矢量化方法可以将第一个1 的offset 内的所有并发1 更改为0s(将A 转换为B)?我目前正在尝试在一个包含超过 100 万个项目的 numpy 数组上执行此操作,其中速度至关重要。
1s 表示信号触发,0s 表示无触发。例如:给定偏移量5,只要有1,以下5项必须是0(以去除信号并发)。
示例 1:
offset = 3
A = np.array([1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0])
B = np.array([1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0])
示例 2:
offset = 2
A = np.array([1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0])
B = np.array([1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0])
【问题讨论】:
-
很抱歉,我不明白您从 A 到 B 的具体路线
-
刚刚更新了问题。 Lmk 如果这样可以解决问题。
-
0之后的第一个1的位置是np.argwhere(np.diff(np.pad(A,1)) == 1).squeeze()。但这对手头的问题并没有真正的帮助,因为您还想在新创建的0s 之后计算1s。 -
“矢量化”在动作是“并行”时最简单——无论顺序如何,对所有元素都执行相同的动作。
numpy方法不实现顺序操作,除了有限的情况,如cumsum和类似的ufunc.accumulate。不是不能对顺序操作进行编码,而是更难创建可以一个接一个地应用的构建块。在某些时候,您可能需要使用像numba这样的编译工具。 -
我将从基于列表的解决方案开始。随着对任务的更好理解,您可能会看到允许您以“多维”方式表达的模式。但是对于长度和间距不同的序列,这可能会很困难。使用
numba加速可能比尝试挤出某种全阵列numpy解决方案更容易。
标签: python arrays numpy vectorization