将两个数列在一个数列的特定范围内,计算另一个数列在该范围内的平均数和分布

2024-04-26 07:49:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我不确定我问的问题是否正确,但考虑两个标准xy

import numpy as np
import matplotlib.pyplot as plt

N = 1000
T = 1.0 / 800.0
x = np.linspace(0.0, N*T, N)
y = np.sin(2.0 * np.pi * x) + 0.5 * np.sin(3 * 2.0 * np.pi * x) \
    + 0.1 * np.random.uniform(-1.0, 1.0, N)
plt.plot(x, y)
plt.show()

现在把x_2看作

M = 10
x_2 = np.linspace(0.0, N*T, N//M)

x分组到长度为M的范围中的一种。现在我想在下面的伪代码中有y_my_v

y_m = average of `y`es for x_2_(i-1) < x < x_2_(i)
y_v = variance of `y`es for x_2_(i-1) < x < x_2_(i)

适用于i范围内的0 < i < N / M。当然,我可以定义一些for循环,但考虑到我的数据集是巨大的,我正在寻找一个更矢量化的方式使用numpy功能。另外,请考虑我的实际数据没有分类。你知道吗

p.S.我被要求实施我所知道的方法:

M = 10
x_2 = np.linspace(x.min(), x.max(), N//M)

y_m = np.zeros(N // M - 1)
y_v = np.zeros(N // M - 1)
for ii in range(N // M - 1):
    y_m[ii] = y[((x_2[ii] <= x) & (x < x_2[ii+1]))].mean()
    y_v[ii] = np.var(y[((x_2[ii] <= x) & (x < x_2[ii+1]))])

plt.plot(x, y)
plt.plot(x_2[:-1], y_m)
plt.show()

p.S.2.一个想法是根据x对压缩后的(x, y)进行排序,然后重塑数据数组,然后计算特定轴的平均值和方差。你知道吗


Tags: of数据importnumpyforesplotas
1条回答
网友
1楼 · 发布于 2024-04-26 07:49:29

因此,我开始使用numpy的reshape函数来实现我在p.S.2.中提出的想法:

MM = 10
x_2 = np.linspace(x.min(), x.max(), N // MM)

z = y[(N % MM):].reshape(((N - (N % MM)) // MM, MM))
y_m = z.mean(axis=1)
y_v = z.var(axis=1)

plt.fill_between(x_2, y_m - 100 * y_v / 2, y_m + 100 * y_v / 2, color="blue")
plt.plot(x_2, y_m, color="red")

结果:

现在这个实现有两个主要的缺点,一个是它假设x数据是均匀分布和排序的,这不一定总是这样。你知道吗

相关问题 更多 >