问题描述
假设我有
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_ori
和 x_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=0
和 i=-1
上的公式计算),并将这段代码应用到 x_new
而没有它的极值对应于 i=0
定义中的 i=-1
和 y_new
。
然后您只需连接这些数组。