这个网站上已经存在很多性能问题,但是我发现几乎所有这些都是特定于问题且相当狭窄的问题.几乎所有人都重复这些建议,以避免过早优化.
我们假设:
我在这里寻找的是在一个关键算法中挤出最后几个百分点的策略和技巧,除此之外别无他法.
理想情况下,尝试使答案语言不可知,并在适用的情况下指出建议策略的任何缺点.
我将使用我自己的初步建议添加回复,并期待Stack Overflow社区可以想到的任何其他内容.
我期待计算数组中的值改变极性的次数(编辑:数组中的值交叉为零的次数).
假设我有一个数组:
[80.6 120.8 -115.6 -76.1 131.3 105.1 138.4 -81.3
-95.3 89.2 -154.1 121.4 -85.1 96.8 68.2]`
Run Code Online (Sandbox Code Playgroud)
我希望伯爵数为8.
一种解决方案是运行循环并检查大于或小于0,并保留先前极性的历史记录.
我们能更快地做到吗?
编辑:我的目的是找到更快的东西,因为我有这些长度在68554308左右的数组,我必须在100多个这样的数组上进行这些计算.
对于数据分析任务,我想在一个numpy数组中找到零交叉,该数组来自先与sobel式内核然后是墨西哥帽内核的卷积。零交叉使我能够检测数据的边缘。
不幸的是,数据有些嘈杂,20在下面的示例中,我只想找到具有最小跳转大小的零交叉点:
import numpy as np
arr = np.array([12, 15, 9, 8, -1, 1, -12, -10, 10])
Run Code Online (Sandbox Code Playgroud)
应该导致
>>>array([1, 3, 7])
Run Code Online (Sandbox Code Playgroud)
要么
>>>array([3, 7])
Run Code Online (Sandbox Code Playgroud)
3的索引在哪里-1,就在第一跳的中间之前,7是的索引-10
我尝试了以下代码的修改(来源:有效地检测python中的符号变化)
zero_crossings = np.where(np.diff(np.sign(np.trunc(arr/10))))[0]
Run Code Online (Sandbox Code Playgroud)
正确地忽略了小的跳跃,但是将零交叉点置于 [1,5,7]
什么是有效的方法?
最小跳跃的定义并不严格,但结果应符合我的问题。
编辑:澄清
arr = np.array([12, 15, 9, 8, -1, 1, -12, -10, 10])
arr_floored = np.trunc(arr/10)
>>>>np.array([10, 10, 0, 0, 0, 0, -10, -10, 10])
sgn = np.sign(arr_floored)
>>>>array([ 1, 1, 0, 0, 0, 0, -1, -1, 1]) …Run Code Online (Sandbox Code Playgroud) 我有使用时间积分计算出的轨道。(x, y)这些轨道的每个位置都有坐标。这种轨道的一个例子如下图所示:

这实际上意味着一个序列,其中 0 表示 x 在时间t_n和之间改变了符号,1 表示 y 在和t_n+1之间改变了符号。对于上图,该系列将如下所示:t_nt_n+1Pxy[n] = 1 0 1 0 1 0 ...
目前我已经找到了多种解决方案。但它们在我使用的大型数据集上都非常慢。上面显示的示例轨道的 x 和 y 坐标数组有 10,000,000 个元素。它需要这么多元素,因为为了足够准确,积分算法中的时间步需要非常小。我能想到的最快算法运行时间大约为 5.3 秒。然而,相同的算法需要针对不同的轨道运行 100 多次。这意味着这将需要很长时间。
我本质上有两种计算方法:第一种算法基于这个问题:“ EfficientlyDetectsign-changesinpython ”并使用numpy:
def calc_Pxy():
Pxy = np.full(x.shape, -1)
Pxy[np.where(np.diff(np.signbit(x)))] = 0
Pxy[np.where(np.diff(np.signbit(y)))] = 1
return Pxy[Pxy >= 0]
Run Code Online (Sandbox Code Playgroud)
第二种解决方案仅使用一个简单的 for 循环:
def calc_Pxy():
Pxy = np.full(x.shape, -1)
Pxy[np.where(np.diff(np.signbit(x)))] = 0
Pxy[np.where(np.diff(np.signbit(y)))] = 1
return Pxy[Pxy >= 0] …Run Code Online (Sandbox Code Playgroud) 我有一个从左到右阅读的数字列表.任何时候我在阅读序列时遇到符号更改我想要计算它.
X = [-3,2,7,-4,1,-1,1,6,-1,0,-2,1]
X = [-, +, +, -, +, -, +, +, -, -,-,+]
Run Code Online (Sandbox Code Playgroud)
因此,在此列表中有8个符号更改.
当Item [0](在这种情况下为-3)为负时,它被认为是符号变化.此外,还会考虑列表中的任何0 [-].
任何帮助将不胜感激.