微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将大数据集粗粒度化为可以在 python 上绘制的内容

如何解决将大数据集粗粒度化为可以在 python 上绘制的内容

假设我有

import numpy as np
import matplotlib. pyplot as plt
N_orig = 1000000
x_orig = np.linspace(0,np.pi,N_orig)
y_orig = np.sin(x_orig)

plt.plot(x_orig,y_orig,'*')
plt.show()

好的,任何像样的机器都可以运行此代码,但无论如何它都不太实用。

我想通过做类似的事情来粗化 x 坐标

N_new = 100
x_new = np.linspace(0,N_new)
dx=abs(x_new[1]-x_new[0])
y_new = ???

使得 y_new[i]y_new[i]=np.mean(y_orig[x[i]-dx/2 < x_orig and x_orig < x[i]+dx/2]) 的值

我知道 for 循环 i 是一种解决方案,但我想要更快的速度。有可用的例程吗?

解决方法

如果您的 x 数组实际上是 x_new,那么您的问题有点过于强大了,因为您只是希望 y_new 的值成为 y_ori固定长度的区间(除了数组的边),因为 x_orix_new 离散化相同的区间,但步长不同。

因此无需编写像 y_orig[x[i]-dx/2 < x_orig and x_orig < x[i]+dx/2] 这样复杂的东西,您可以简单地计算这些区间上 y_ori 的均值。这样做:

fixed_len = ((x_new[1]-dx/2 < x_orig) & (x_orig < x_new[1]+dx/2)).sum() # No need to write this,you could calculate it directly with a bit of mathematics. 
# Warning : don't do it on x_new[0] as you'll experience side effect

y_new = y_ori.reshape((-1,fixed_len)) # -1 so that the number of lines is automatically inferred.
y_new = np.mean(y_new,axis=1)

这种方法的缺点是它没有处理副作用的开头和结尾y_new,其中要平均的数组长度不是等于 fixed_len),因此它不完全正确。一个简单的解决方案是之前计算这些均值(也就是说,使用 i=0i=-1 上的公式计算),并将这段代码应用到 x_new 而没有它的极值对应于 i=0 定义中的 i=-1y_new

然后您只需连接这些数组。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。