将数组插值到恒定密度 - python

我一直在绕着这个看似简单的问题盘旋了好几个小时,但我似乎找不到答案。

设置很简单:给定一个浮点数组,对额外的点进行插值,以便以恒定(或近似恒定)的密度分布生成的插值数据。

标准插值有效,但是插值点的密度根本不是恒定的(右图):

将数组插值到恒定密度 - python

我肯定会在这里遗漏一些明显的东西,因为我确信这个问题并不那么复杂,而且我已经苦苦挣扎了很长时间。

任何帮助深表感谢。

import numpy as np
import matplotlib.pyplot as plt

data = np.array([13.826, 13.608, 13.163, 13.034, 12.672, 12.126, 11.585, 11.192,
       10.609, 10.082,  9.67 ,  9.261,  9.175,  8.869,  8.408,  7.868,
        7.317,  6.827,  6.52 ,  6.375,  5.968,  5.601,  5.271,  5.242,
        4.961,  4.888,  4.661,  4.395,  4.376,  4.286,  4.105,  4.019,
        3.845,  3.785,  3.601,  3.371,  3.226,  3.156,  2.984,  2.96 ,
        2.931,  2.786,  2.757,  2.62 ,  2.554,  2.473,  2.464,  2.451,
        2.309,  2.196,  2.15 ,  2.061,  1.987,  1.907,  1.825,  1.803,
        1.721,  1.62 ,  1.595,  1.57 ,  1.462,  1.346,  1.334,  1.208,
        1.09 ,  1.033,  0.94 ,  0.874,  0.852,  0.857,  0.872,  0.884,
        0.889,  0.888,  0.9  ,  0.856,  0.756,  0.652,  0.567,  0.495,
        0.432,  0.378,  0.331,  0.293,  0.264,  0.244,  0.232,  0.228,
        0.228,  0.231,  0.239,  0.248,  0.261,  0.278,  0.308,  0.357,
        0.417,  0.495,  0.575,  0.59 ,  0.544,  0.465,  0.355,  0.246,
        0.138,  0.032, -0.032, -0.075, -0.139, -0.179, -0.28 , -0.38 ,
       -0.471, -0.565, -0.671, -0.772, -0.872, -0.974, -1.069, -1.164,
       -1.257, -1.169, -1.131, -1.084, -1.016, -0.936, -0.846, -0.748,
       -0.647, -0.546, -0.444, -0.348, -0.274, -0.159, -0.05 ,  0.091,
        0.145,  0.236,  0.318,  0.239,  0.105, -0.036, -0.168, -0.303,
       -0.304, -0.429, -0.571, -0.685, -0.704, -0.806, -0.849, -0.865,
       -0.835, -0.823, -0.892, -0.928, -0.978, -1.077, -1.156, -1.065,
       -1.153, -1.244, -1.332, -1.426, -1.523, -1.623, -1.722, -1.819,
       -1.918, -2.03 , -2.135, -2.233, -2.33 , -2.423, -2.516, -2.609,
       -2.7  , -2.791, -2.88 , -2.948, -3.913])

# Number of points to interpolate
N = 1000
t = np.linspace(0, 1, N)
xp = np.linspace(0, 1, data.size)
# Interpolated data
d_interp = np.interp(t, xp, data)

plt.subplot(121)
plt.scatter(t, d_interp, label='Interpolated points')
plt.scatter(xp, data, s=4, label='Original data')
plt.legend()
plt.subplot(122)
plt.hist(d_interp, 25, label='Density of interpolated data')
plt.legend()
plt.show()

参考方案

您想采样y点而不是x点。采样y点很容易:

d_interp = np.linspace(data.min(), data.max(), N)

现在您要插值(y,x)而不是(x,y)。您可以尝试使用此方法,但这不起作用:

t = np.interp(d_interp, data, xp)

问题在于对相应的x点进行插值:np.interp期望您的x单调增加。实际上,通过在图表中选择随机的y点(例如x=0),可以得到2或3个对应的x点。因此,对于每个y,您都不知道选择哪个x

我建议的解决方案是,鉴于您的功能大部分在减少,请使用遮罩过滤样本集:

mask = np.append(True, np.diff(data) < 0)   #first points, plus all monotonally decreasing y points
d_interp = np.linspace(data.min(), data.max(), N)
t = np.interp(d_interp, data[mask][::-1], xp[mask][::-1])

将数组插值到恒定密度 - python

numpy.savetxt“元组索引超出范围”? - python

我试图在文本文件中写几行,这是我使用的代码:import numpy as np # Generate some test data data = np.arange(0.0,1000.0,50.0) with file('test.txt', 'w') as outfile: outfile.write('…

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python:图像处理可产生皱纹纸效果 - python

也许很难描述我的问题。我正在寻找Python中的算法,以在带有某些文本的白色图像上创建皱纹纸效果。我的第一个尝试是在带有文字的图像上添加一些真实的皱纹纸图像(具有透明度)。看起来不错,但副作用是文本没有真正起皱。所以我正在寻找更好的解决方案,有什么想法吗?谢谢 参考方案 除了使用透明性之外,假设您有两张相同尺寸的图像,一张在皱纹纸上明亮,一张在白色背景上有深…

Python uuid4,如何限制唯一字符的长度 - python

在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…