程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在没有循环的数组矢量化 (1D) 期间索引 numpy 数组中的其他值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在没有循环的数组矢量化 (1D) 期间索引 numpy 数组中的其他值?

开发过程中遇到在没有循环的数组矢量化 (1D) 期间索引 numpy 数组中的其他值的问题如何解决?下面主要结合日常开发的经验,给出你关于在没有循环的数组矢量化 (1D) 期间索引 numpy 数组中的其他值的解决方法建议,希望对你解决在没有循环的数组矢量化 (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,请注明来意。