如何无循环实现Numpy数组按x[i]/x[i+1]规则转换?
无循环实现Numpy数组的
y[i] = x[i]/x[i+1]转换方案 嘿,我来帮你搞定这个问题!既然不能用for/while循环,那咱们就用Numpy最擅长的矢量化操作来解决——利用数组切片就能轻松实现,完全不用写循环。
基础版:得到长度为原数组-1的结果
如果你的需求是严格的y[i] = x[i]/x[i+1](每个元素对应下一个元素的比值),那直接用数组切片就行:
import numpy as np x = np.array([1, 2, 3, 6]) y = x[:-1] / x[1:] print(y) # 输出: [0.5 0.66666667 0.5 ]
解释一下:x[:-1]取的是x里除了最后一个元素的所有值,x[1:]取的是x里除了第一个元素的所有值,这两个数组长度相同,直接做除法就得到了每个x[i]/x[i+1]的结果。
匹配原数组长度的版本(补全最后一个元素)
看你给的示例,y的长度和x一样(都是4个元素),最后一个值是0.5。这种情况咱们可以先算出核心的比值数组,再把需要的最后一个元素补进去就行:
import numpy as np x = np.array([1, 2, 3, 6]) # 先算核心的相邻元素比值 core_y = x[:-1] / x[1:] # 补全最后一个元素,这里用你示例里的0.5,你可以换成自己需要的规则(比如x[-1]/x[-1]得到1) y = np.append(core_y, 0.5) print(y) # 输出: [0.5 0.66666667 0.5 0.5 ]
要是你的补全规则和时间序列有关(比如用特定值填充),直接把0.5替换成对应的计算逻辑就好。
针对时间序列收益率的小补充
你说最终要做时间序列的收益率数组,一般金融里的收益率是(下一个值-当前值)/当前值或者下一个值/当前值 - 1,要是你需要的是这种,同样用切片就能实现:
# 简单收益率:(x[i+1] - x[i])/x[i] returns = (x[1:] - x[:-1]) / x[:-1] # 或者更简洁的写法 returns = x[1:]/x[:-1] - 1
如果确实是你说的x[i]/x[i+1](当前值除以下一个值),那前面的基础版就完全够用。
为啥不用循环?
Numpy的矢量化操作是底层用C实现的,比Python循环快太多了,尤其是数组很大的时候,性能差距特别明显,这也是处理数值计算时优先用Numpy矢量化的原因。
内容的提问来源于stack exchange,提问作者Vincent Teyssier
相关产品推荐
相关产品推荐

