大佬教程收集整理的这篇文章主要介绍了在没有循环的数组矢量化 (1D) 期间索引 numpy 数组中的其他值,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我的任务是将“1-2-1”过滤器应用于 numpy 数组并返回过滤数据的数组。 不使用 for 循环 while 循环或列表解析。
“1-2-1”过滤器将每个数据点映射到自身两次及其相邻点的平均值。例如,如果在某个时刻数据包含 ...1,4,3... 那么在应用“1-2-1”过滤器后,4 将被替换为 ( 1 + 4 + 4 + 3) / 4 = 12 / 4 = 3。
例如numpy数组[1,1,3,2]
应用过滤器后会产生一个 numpy 数组 [1. 1.75 3. 3. 2. ]
由于数据的端点没有两个邻居,因此 1-2-1 过滤器仅应用于内部 len(data) - 2 个点,端点保持不变。
本质上,我需要在 numpy 数组矢量化期间访问给定点之前和之后的值。对于可以是任意长度的数组。尽管我在谷歌上搜索过,但我无法解决。
熊猫解决方案
s = pd.Series(l)
>>> s.rolling(3,center=TruE).sum().add(s).div(4).fillna(s).values
array([1.,1.75,3.,2. ])
循序渐进:
>>> s.rolling(3,center=TruE).sum().values
array([nan,6.,8.,9.,nan])
>>> s.rolling(3,center=TruE).sum().add(s).values
array([nan,7.,12.,center=TruE).sum().add(s).div(4).values
array([ nan,2. ])
Numpy 解决方案
a = np.array(l)
>>> np.concatenate([a[:1],np.convolve(a,[1,2,1],mode="valid") / 4,a[-1:]])
循序渐进:
>>> np.convolve(a,mode="valid")
array([ 7,12,12])
>>> np.convolve(a,mode="valid") / 4
array([1.75,3. ])
>>> np.concatenate([a[:1],a[-1:]])
array([1.,2. ])
性能
%timeit s.rolling(3,center=TruE).sum().add(s).div(4).fillna(s).values
706 µs ± 4.62 µs per loop (mean ± std. dev. of 7 runs,1000 loops each)
%timeit np.concatenate([a[:1],a[-1:]])
10.8 µs ± 22.2 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)
,
你可以试试这样的:
import numpy as np
from scipy.linalg import circulant
x = np.array([1,1,4,3,2])
val = np.array([1,1])
offsets = np.array([0,2])
col0 = np.zeros(len(X))
col0[offsets] = val
C = circulant(col0).T[:-(len(val) - 1)]
print(C)
C
本质上是一个 circulant 矩阵,如下所示:
array([[1.,2.,1.,0.,0.],[0.,1.]])
现在您可以简单地计算过滤后的输出,如下所示:
y = (C @ X) / 4
print(y)
# array([1.75,3. ])
以上是大佬教程为你收集整理的在没有循环的数组矢量化 (1D) 期间索引 numpy 数组中的其他值全部内容,希望文章能够帮你解决在没有循环的数组矢量化 (1D) 期间索引 numpy 数组中的其他值所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。