numpy 如何找到一个系列中的损失数量

ddhy6vgd  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(75)

我有一个像[0, 0, 0, 1, 2, -1, -2, 5, 8, 4, 5.5]这样的数组,想找出一个元素小于前一个元素的次数(忽略开头代表缺失数据的零)。
在这个例子中,答案是3(代表-1,-2和4),我必须将其除以有效数字的数量(例如,8),预期结果为3/8 = 0.375。
我写了一个指令,想知道是否有一个更有效的方法来拥有它,因为我必须运行它数百万次。
我目前的指导:

v = np.array([0, 0, 0, 1, 2, -1, -2, 5, 8, 4, 5.5])
print(np.sum((v < np.roll(v,1))[1:]) / np.sum(v != 0)) # loss frequency

有线索吗?
注意:一旦有第一个有效数字(即与0不同),以下所有数字(包括0)均有效。

6ioyuze2

6ioyuze21#

使用np.trim_zeros(修剪前导零)和简单减法:

v_trimmed = np.trim_zeros(v, 'f')
np.sum((v_trimmed[1:] - v_trimmed[:-1]) < 0) / len(v_trimmed)

或者使用np.diff进行减法:

np.sum(np.diff(v_trimmed) < 0) / len(v_trimmed)
0.375
kiz8lqtg

kiz8lqtg2#

这里有一个方法:

  • 使用np.argmax获取第一个非零值(v != 0)的索引,并从那里切片。
  • 应用np.diff,检查小于0(< 0)的值,并应用np.sumTrue(1)值求和。
  • 最后将总和除以切片的长度。
import numpy as np

v = np.array([0, 0, 0, 1, 2, -1, -2, 5, 8, 4, 5.5])

v_slice = v[np.argmax(v != 0):]

result = np.sum(np.diff(v_slice) < 0) / len(v_slice)

result
# 0.375

或者,完全具有np功能:

v_slice = v[np.argmax(v.not_equal(0)):]

result = np.divide(np.sum(np.less(np.diff(v_slice), 0)), v_slice.shape[0])

相关问题