以下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:追加与数组初始化 为了更仔细地了解数组初始