如何在 Numpy 中为不同的 space 维度随机生成固定数量的点?

How to randomly generate a fixed number of points for different space dimension in Numpy?

我想创建一个n维数组,其中随机点的个数为常数,并在python中找到离原点最近的一个。

准确地说我想在一个n维数组中创建均匀分布的100个随机点,维度范围为1到10,然后找到与原点距离最小的那个。我会在每个维度重复这个过程 50 次,取最小距离的平均值,以避免随机性导致的错误值。显然,随着尺寸变大,到原点的最小距离会变大,我会绘制这个变大的图。

所以,我尝试使用 numpy.ndarray 但我不知道如何设置这个数组的大小。它是否应该包含一个内部有 10 个元素的元组来创建一个 10 维数组?如果是,我该如何设置这个元组?例如元组 (1,2,3...,10) 是一个不错的选择?在这一点上我输了。或者 size=(10,10) 创建 10 维数组?

我发现的另一个选项是 numpy.random.uniform(),它也包括尺寸选项。我这里有同样的问题,如何设置大小?

我没能正确理解n维数组的用法。您能否分享您的直觉来帮助我理解如何创建 n 维数组?

形状参数将决定每个维度的外观。您可能想要一个每个维度都相同的数组:10x10 是一个有 100 个值(10 行,10 列)的正方形; 10x10x10 是一个有 1000 个值的立方体(10 层,10 行 10 列)等。Numpy 使用 n 值元组表示 n 维形状:(100, 100, 100) 的形状表示具有 100 层的 3 维数组, 100 行和 100 列。

如果你让不同的轴不相等,你会得到一个畸形的 space(5x10x10 就像一个被锯成两半的立方体),你可能不希望这个缩短的尺寸对你的数据。

但是 - 您实际上不需要 ndarray 来满足您的需要,只需一点数学运算。因为你只需要在 n 维 space 中选择一些点 - 那里没有什么可存储的。例如,坐标从 0 到 1 的正方形上的随机点可能位于 (0.17263, 0.89837)。 3D 中的随机点 space: (0.2, 0.8, 0.413),为什么不呢。因此,您实际上只需要一个点,它是一个 n 值元组(或一个 n 值向量,它是一个具有 n 个值的一维 ndarray!)。您可以通过一个简单的数学公式计算出点到原点的距离。

如果用n个值的一维向量表示一个点,也可以将100个点表示为100 x n的二维数组。 numpy 让你可以很容易地使用 linalg.norm.

找出到原点的距离

更好的是 - 如果您仅在三维中将此数据分层 50 次,您可以重复 50 次!

现在一起:

[np.mean(
    np.min(
        np.linalg.norm(
            np.random.uniform(size=(50, 100, n)),
            axis=2),
        axis=1)
    )
    for n in range(1, 10)
]
# => [0.009492603803501707, 0.09181966148462747, 0.24366046555716356, 
#     0.4013816188406919, 0.530519283865695, 0.6486607488450368, 
#     0.7944752716376989, 0.892977161731248, 0.9967767337128051]

因此对于从 1 到 10 的每个维度 n,我们制作一堆随机数(默认从 0 到 1,您可以通过另一个参数将其更改为 uniform):50 x 100 x n。 50 层用于 50 种不同的实验;每个实验100分100分; n 对于每个点的 n 个维度。然后我们使用 linalg.norm 找到到原点的距离:axis=2 告诉我们这是这个数组的第三个(第三个 = #2!)维度,我们将对其进行平方、求和和求根,一个具有 n 值。我们最终得到 50x100 的距离数组。然后我们沿着第二个轴找到最小值,现在有 100 个距离,得到一个有 50 个最小值的向量。最后,计算平均值。每个维度的平均值通过列表理解收集到一个具有 10 个值的数组中,从 1 到 10 的每个维度数一个平均值。