如何在Numpy中为不同的空间尺寸随机生成固定数量的点?

时间:2018-08-24 11:20:15

标签: python arrays numpy multidimensional-array numpy-ndarray

我想用恒定数量的随机点创建一个n维数组,并在python中找到最接近原点的数组。

确切地说,我想在n维数组中创建均匀分布的100个随机点,维数范围为1到10,然后找到距原点距离最小的一个随机点。我将在每个维度上重复此过程50次,并获得最小距离的平均值,以避免随机性导致的错误值。显然,随着尺寸的增大,到原点的最小距离将增大,我将对其进行绘制。

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

我发现的另一个选项是numpy.random.uniform(),其中还包括size选项。我在这里遇到同样的问题,如何设置尺寸?

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

1 个答案:

答案 0 :(得分:1)

shape参数将确定每个尺寸的外观。您可能需要一个每个维度都相同的数组:10x10是一个具有100个值的正方形(10行,10列); 10x10x10是具有1000个值的多维数据集(10层10行10列)等。数字块使用n值元组表示n维形状:(100, 100, 100)的形状表示100层3维数组,100行和100列。

如果您使不同的轴不相等,则会得到变形的空间(5x10x10就像被锯成两半的立方体一样),并且您可能不希望这种缩短的尺寸对数据产生影响。

但是-实际上,您不需要ndarray,只需一点数学即可。因为您只需要在n维空间中选择一些点,所以没有什么可存储的。例如,坐标为0到1的正方形上的随机点可能位于(0.17263, 0.89837)处。 3D空间中的一个随机点:(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将其更改):{{1 }}。 50层用于50个不同的实验;每个实验100分,满分100分; n为每点n个尺寸。然后,我们使用50 x 100 x n找到到原点的距离:linalg.norm告诉我们,将要平方,求和和生根的是该数组的第三个维度(third =#2!)。具有axis=2值的一个。我们最终得到了50x100的距离数组。然后,我们沿着第二个轴找到最小值,该第二个轴现在具有100个距离,从而产生一个具有50个最小值的向量。最后,计算平均值。通过列表理解将每个维度的平均值收集到一个包含10个值的数组中,其中从1到10的每个维度数均取一个平均值。