矢量和的多维数组在numpy中

时间:2013-11-15 15:11:40

标签: python arrays numpy

如果我在一个numpy数组中有一个N ^ 3三元组数组,我如何对数组中的所有三元组进行向量和?出于某种原因,我无法将我的大脑包裹在总和指数之内。这是我尝试过的,但它似乎不起作用:

a = np.random.random((5,5,5,3)) - 0.5
s = a.sum((0,1,2))
np.linalg.norm(s)

我希望随着N变大,如果总和正常工作,我应该收敛到0,但我只是继续变大。总和给了我一个正确形状的矢量(3x1),但显然我一定做错了。我知道这应该很容易,但我只是没有得到它。

提前致谢!

2 个答案:

答案 0 :(得分:3)

正如评论所指出的,平方总和没有理由接近零。根据描述,N三维向量的数组听起来应该具有(N,3)而不是(N,N,N,3)的形状,但我可能会误解它。无论哪种方式,都很容易观察到两种情况下发生的情况:

import numpy as np

avg_sum = []
sq_sum  = []

N_val = 2**np.arange(15)
for N in N_val:
    A = np.random.random((N,3)) - 0.5
    avg_sum.append( A.sum(axis=1).mean() )
    sq_sum.append ( (A**2).sum(axis=1).mean() )

import pylab as plt
plt.plot(N_val, avg_sum, label="Average sum")
plt.plot(N_val, sq_sum,  label="Squared sum")
plt.legend(loc="best")
plt.show()

enter image description here

你的直觉预期平均总和为零。

答案 1 :(得分:3)

如果不是统一的随机数,我们使用标准的正常数字,而且定性结果可以应用于您的特定情况,那么分析是否更容易理解您的问题:

>>> a = np.random.normal(0, 1, size=(5, 5, 5, 3))
>>> s = a.sum(axis=(0, 1, 2))

所以现在s的三个项目中的每一项都是125个数字的总和,每个数字都是从标准正态分布中提取的。一个公认的事实是,将两个正态分布相加可以得到另一个正态分布,均值是平均值之和,方差之和是方差之和。因此,s中的三个值中的每一个都将作为正态分布的随机样本分布,均值为0,标准差为sqrt(125)= 11.18。

分布的方差增长这一事实意味着,即使您多次运行代码,您也会看到每个数字的平均值为0,在任何给定的运行中,您更有可能看到更大的数字偏离0。

此外,您可以计算这三个值的范数。平方三个标准正态分布并将它们加在一起会得到chi-squared distribution。如果你拿平方根,你得到一个chi distribution。前者更容易处理,它预测三个值的范数平方的平均值将是3 * 125.而且它肯定似乎是:

>>> mean_norm_sq = 0
>>> for n in xrange(1000):
...     a = np.random.normal(0, 1, size=(5, 5, 5, 3))
...     s = a.sum(axis=(0, 1, 2))
...     mean_norm_sq += np.sum(s**2)
... 
>>> mean_norm_sq / 1000
374.47629802482447