当前位置: 首页 > 面试题库 >

如果超出限制,则重置累积金额(python)

卢子民
2023-03-14
问题内容

以下numpy代码段将返回输入数组的总和,每次遇到NaN时都会重置。

v = np.array([1., 1., 1., np.nan, 1., 1., 1., 1., np.nan, 1.])
n = np.isnan(v)
a = ~n
c = np.cumsum(a)
d = np.diff(np.concatenate(([0.], c[n])))
v[n] = -d
result = np.cumsum(v)

以类似的方式,如果使用矢量化的熊猫或numpy操作,如果总和超过某个值,我该如何计算将重置的总和?

例如,极限= 5,输入= [1,1,1,1,1,1,1,1,1,1],输出= [1,2,3,4,5,1,2,3,4 ,5]


问题答案:

如果数组中的数字都是正数,则使用起来可能最简单cumsum(),然后取模运算符:

>>> a = np.array([1,1,1,1,1,1,1,1,1,1])
>>> limit = 5
>>> x = a.cumsum() % limit
>>> x
array([1, 2, 3, 4, 0, 1, 2, 3, 4, 0])

然后,您可以将任何零值设置回限制以获取所需的数组:

>>> x[x == 0] = limit
>>> x
array([1, 2, 3, 4, 5, 1, 2, 3, 4, 5])

这是使用熊猫expanding_apply方法的一种可能的通用解决方案。(我尚未对其进行广泛的测试…)

首先定义一个修改后的cumsum函数:

import pandas as pd

def cumsum_limit(x):
    q = np.sum(x[:-1])
    if q > 0:
        q = q%5
    r = x[-1]
    if q+r <= 5:
        return q+r
    elif (q+r)%5 == 0:
        return 5
    else:
        return (q+r)%5

a = np.array([1,1,1,1,1,1,1,1,1,1]) # your example array

将函数应用于数组,如下所示:

>>> pd.expanding_apply(a, lambda x: cumsum_limit(x))
array([ 1.,  2.,  3.,  4.,  5.,  1.,  2.,  3.,  4.,  5.])

这是应用于另一个更有趣的系列的函数:

>>> s = pd.Series([3, -8, 4, 5, -3, 501, 7, -100, 98, 3])
>>> pd.expanding_apply(s, lambda x: cumsum_limit(x)) 
0     3
1    -5
2    -1
3     4
4     1
5     2
6     4
7   -96
8     2
9     5
dtype: float64


 类似资料:
  • 问题内容: 如果我使用这样的1或NaN命名: 我想计算该系列的总和,但应在NaN的位置将其重置(设置为零),如下所示: 理想情况下,我希望有一个矢量化解决方案! 我曾经在Matlab上看到过类似的问题: 在NaN上重置Matlabcumsum吗? 但我不知道如何翻译这行 问题答案: Matlab代码的简单Numpy翻译是这样的: 执行此代码将返回结果。此解决方案仅会与原始解决方案一样有效,但是如果

  • 问题内容: 上面的选择向我返回了以下内容。 我如何获得以下信息: 问题答案: SQL Fiddle示例 输出 编辑:这是一个通用的解决方案,将可在大多数数据库平台上使用。如果您的特定平台(例如gareth的)有更好的解决方案,请使用它!

  • 我想在Spark中做累积和。以下是注册表(输入): 配置单元查询: 输出: 使用火花逻辑,我得到相同的输出: 然而,当我在spark cluster上尝试这个逻辑时,的值将是累积和的一半,有时它是不同的。我不知道为什么它会发生在spark cluster上。是因为分区吗? 如何计算spark cluster上一列的累积和?

  • 问题内容: 我试图将InputStream复制到文件,如果InputStream的大小大于1MB,则中止复制。在Java7中,我编写了如下代码: 第一个问题:是否有更好的解决方案? 第二个问题:我的另一个解决方案-在复制操作之前,我先计算此InputStream的大小。所以我复制InputStream 然后得到。但是问题是InputStream可能不是,因此InputStream无法在复制文件操作

  • 问题内容: 我使用goroutines实现http.Get超时,然后我发现goroutines的数量一直在稳定增长,当达到1000左右时,程序将退出 码: http://play.golang.org/p/SzGTMMmZkI 问题答案: 用1而不是0初始化chan: 并删除关闭并延迟ch的延迟块。 参见:http : //blog.golang.org/go-concurrency-patter

  • 问题内容: 我有这个数据框 我需要做的是从C列开始累积值的总和,直到下一个值为零,然后重置累积总和,直到完成所有行。 预期产量: 我已经使用了该函数并达到了期望的输出,但是问题是您无法定义固定的窗口范围,因为DataFrame可以连续五次显示数字,有时只能是两次,依此类推。 我的问题与以下Pyspark非常相似:重置条件下的累积总和,但没有人回答。 要重现数据帧: 问题答案: 创建一个临时列(),

  • 我目前正在使用jenkins创建一个性能框架,并执行jenkins的性能测试。我正在使用https://github.com/jmeter-maven-plugin/jmeter-maven-plugin这个插件。在这个性能框架中,单用户的健全性测试运行良好,并进行了200个用户的实际性能测试,在2分钟内收到了错误消息。lang.OutOfMemoryError:超出了GC开销限制。我在jenki

  • 问题内容: 说我有一段距离。 我想从x到达总和达到10的索引,在这种情况下,idx = [4,9]。 因此,满足条件后,cumsum重新启动。 我可以使用循环来完成此操作,但是对于大型阵列而言,循环速度很慢,我想知道是否可以用某种方式来执行。 问题答案: 这是一个带有numba和数组初始化的代码- 时机 包括并使用同一篇文章中的基准测试设置- Numba:追加与数组初始化 为了更仔细地了解数组初始