非均匀分布 np.array,边界附近有更多点

Non-evenly spaced np.array with more points near the boundary

我有一个间隔,比如 (0, 9),我必须在它们之间生成点,以便它们在两个边界处都更密集。我知道点数,比如说n_x。 alpha 决定系统的“密度”,如果 alpha = 1,则点均匀分布。

n_x 和 n_y 的叉积应该是这样的:

[

到目前为止,我最接近的是使用 np.geomspace,但它只在域的左侧附近密集,

In [55]: np.geomspace(1,10,15) - 1
Out[55]: 
array([0.        , 0.17876863, 0.38949549, 0.63789371, 0.93069773,
       1.27584593, 1.6826958 , 2.16227766, 2.72759372, 3.39397056,
       4.17947468, 5.1054023 , 6.19685673, 7.48342898, 9.        ])

我也试过将域分成两部分,(0,4), (5,10) 但这也没有帮助(因为 geomspace 只在域的 LHS 给出更多点) .

In [29]: np.geomspace(5,10, 15)
Out[29]: 
array([ 5.        ,  5.25378319,  5.52044757,  5.80064693,  6.09506827,
        6.40443345,  6.72950096,  7.07106781,  7.42997145,  7.80709182,
        8.20335356,  8.61972821,  9.05723664,  9.51695153, 10.        ])

除此之外,我对可以使用哪个数学函数来生成这样的数组感到有点困惑。

您可以使用累积 beta 函数并映射到您的范围。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import beta

def denseboundspace(size=30, start=0, end=9, alpha=.5):
    x = np.linspace(0, 1, size)
    return start + beta.cdf(x, 2.-alpha, 2.-alpha) * (end-start)

n_x = denseboundspace()
#[0.         0.09681662 0.27092155 0.49228501 0.74944966 1.03538131
# 1.34503326 1.67445822 2.02038968 2.38001283 2.75082572 3.13054817
# 3.51705806 3.9083439  4.30246751 4.69753249 5.0916561  5.48294194
# 5.86945183 6.24917428 6.61998717 6.97961032 7.32554178 7.65496674
# 7.96461869 8.25055034 8.50771499 8.72907845 8.90318338 9.        ]

plt.vlines(n_x, 0,2);

n_x = denseboundspace(size=13, start=1.2, end=7.8, alpha=1.0)
#[1.2  1.75 2.3  2.85 3.4  3.95 4.5  5.05 5.6  6.15 6.7  7.25 7.8 ]

plt.vlines(n_x, 0,2);

点差由alpha参数连续控制。