gpt4 book ai didi

python - 具有非均匀间隔的 np.arange 或 np.linspace 的替代品

转载 作者:行者123 更新时间:2023-12-02 02:46:25 28 4
gpt4 key购买 nike

我可以使用numpy的函数np.arange()[0,2*pi)上获得统一的网格,但是,我想要一个具有相同的网格点的数量,但在一定间隔上具有更高的点密度,即例如在 [pi,1.5*pi] 上具有更精细的网格。我怎样才能实现这一点,是否有一个 numpy 函数接受密度函数并且它的输出是具有该密度的网格?

最佳答案

令我惊讶的是,我在 Stack Overflow 上找不到类似的问答。有一些人正在为 random numbers from a discrete distribution 做类似的事情,但不适用于连续分布,也不适用于修改后的 np.arangenp.linspace

如果您需要获得用于绘图的 x 范围,该范围在您期望函数波动更快的区域中具有更精细的采样,您可以创建一个非线性函数,该函数接受 0 到 1 范围内的输入并以相同的范围生成输出非线性进行的范围。例如:

def f(x):
return x**2

angles = 2*np.pi*f(np.linspace(0, 1, num, endpoint=False))

这将产生接近零的精细采样和接近 2*pi 的粗采样。为了更细粒度地控制采样密度,您可以使用下面的函数。作为奖励,它还允许随机采样。

import numpy as np

def density_space(xs, ps, n, endpoint=False, order=1, random=False):
"""Draw samples with spacing specified by a density function.

Copyright Han-Kwang Nienhuys (2020).
License: any of: CC-BY, CC-BY-SA, BSD, LGPL, GPL.
Reference: https://stackoverflow.com/a/62740029/6228891

Parameters:

- xs: array, ordered by increasing values.
- ps: array, corresponding densities (not normalized).
- n: number of output values.
- endpoint: whether to include x[-1] in the output.
- order: interpolation order (1 or 2). Order 2 will
require dense sampling and a smoothly varying density
to work correctly.
- random: whether to return random samples, ignoring endpoint).
in this case, n can be a shape tuple.

Return:

- array, shape (n,), with values from xs[0] to xs[-1]
"""
from scipy.interpolate import interp1d
from scipy.integrate import cumtrapz

cps = cumtrapz(ps, xs, initial=0)
cps *= (1/cps[-1])
intfunc = interp1d(cps, xs, kind=order)
if random:
return intfunc(np.random.uniform(size=n))
else:
return intfunc(np.linspace(0, 1, n, endpoint=endpoint))

测试:

values = density_space(
[0, 100, 101, 200],
[1, 1, 2, 2],
n=12, endpoint=True)

print(np.around(values))

[ 0. 27. 54. 82. 105. 118. 132. 146. 159. 173. 186. 200.]

累积密度函数是使用梯形积分创建的,梯形积分本质上基于线性插值。高阶积分并不安全,因为输入可能具有(接近)不连续性,例如示例中从 x=100 跳转到 x=101。输入的不连续性会导致累积密度函数(代码中的cps)中的一阶导数不连续,这将导致平滑插值(2 阶或以上)出现问题。因此,建议仅将 order=2 用于平滑密度函数 - 而不是使用任何更高的阶数。

关于python - 具有非均匀间隔的 np.arange 或 np.linspace 的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62734780/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com