我想用恒定数量的随机点创建一个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维数组?
答案 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的每个维度数均取一个平均值。