Numpy 如何从数字数组a计算每个参数a的每个和

Numpy 如何从数字数组a计算每个参数a的每个和,numpy,Numpy,我想计算a中a的每个值的以下总和: D = np.array([1, 2, 3, 4]) A = np.array([0.5, 0.25, -0.5]) beta = 0.5 np.sum(np.square(beta) - np.square(D-a)) 结果是所有和的数组。要手动计算它,它将如下所示: [np.sum(np.square(beta)-np.square(D-0.5)), np.sum(np.square(beta)-np.square(D-0.25)), n

我想计算a中a的每个值的以下总和:

D = np.array([1, 2, 3, 4])
A = np.array([0.5, 0.25, -0.5]) 
beta = 0.5

np.sum(np.square(beta) - np.square(D-a))
结果是所有和的数组。要手动计算它,它将如下所示:

 [np.sum(np.square(beta)-np.square(D-0.5)), 
  np.sum(np.square(beta)-np.square(D-0.25)),
  np.sum(np.square(beta)-np.square(D-0.5))]

我对numpy不太熟悉,所以可能有一种矢量化的方法来实现这一点。但通过列表理解,这将:

[ np.sum(np.square(beta) - np.square(D-a)) for a in A ]
输出:

[-20.0, -24.25, -40.0]

np.sum
与广播一起使用

np.sum(np.square(beta) - np.square(D[None,:] - A[:,None]), axis=1)

Out[98]: array([-20.  , -24.25, -40.  ])

解释:我们需要整个数组D减去数组A的每个元素。我们不能简单地调用
D
-
A
,因为它只是在
D
A
之间进行元素相减。因此,我们需要使用numpy广播。我们需要在
D
A
中增加一个维度,以满足广播规则。之后,只需进行计算并沿轴=1求和

一步一步地
将轴=0处的尺寸
D
1D
增加到
2D

In [10]: D[None,:]
Out[10]: array([[1, 2, 3, 4]])

In [11]: D.shape
Out[11]: (4,)

In [12]: D[None,:].shape
Out[12]: (1, 4)
A
执行相同操作,但轴=1

In [13]: A[:,None]
Out[13]: 
array([[ 0.5 ],
       [ 0.25],
       [-0.5 ]])

In [14]: A.shape
Out[14]: (3,)

In [15]: A[:,None].shape
Out[15]: (3, 1)
在减法运算中,numpy广播开始将每个数组广播到兼容的维度,并执行减法运算以创建2D数组结果

In [16]: D[None,:] - A[:,None]
Out[16]:
array([[0.5 , 1.5 , 2.5 , 3.5 ],
       [0.75, 1.75, 2.75, 3.75],
       [1.5 , 2.5 , 3.5 , 4.5 ]])
接下来,它只是元素方面的
square
和减法和
square

np.square(beta) - np.square(D[None,:] - A[:,None])

Out[17]:
array([[  0.    ,  -2.    ,  -6.    , -12.    ],
       [ -0.3125,  -2.8125,  -7.3125, -13.8125],
       [ -2.    ,  -6.    , -12.    , -20.    ]])
最后,沿轴求和=1以获得最终输出:

np.sum(np.square(beta) - np.square(D[None,:] - A[:,None]), axis=1)

Out[18]: array([-20.  , -24.25, -40.  ])

您可以在此处阅读有关numpy广播的文档以获取更多信息

欢迎!你试了什么?大家好,这是一段伪代码,它描述了我在计算和的同时通过每个a来生成我给出的最后一个示例的意图。没有办法逐字逐句地写出来,所以我要问的是允许它用numpy写的技巧。我已经得到了下面的答案,但我不确定这是做这类事情的最好方法,还是有更好的方法。非常感谢。你能告诉我为什么会这样吗?这似乎很神奇。最后一个问题,如果我在生产环境中编写这样的代码(因为没有更好的词),我会不赞成这样做,还是认为这样做很惯用?@ruzq:为了更好地调试和维护代码,最好将这一行代码分成几行。一些公司可能有限制嵌套函数调用和循环数量的编码指南。在本例中,它嵌套了3个级别。我认为两级嵌套是常见的指导。在协作代码中,您可以将
None
更改为
np.newaxis
,以使其更加详细和清晰。Pandas基于python,python zen是
显式优于隐式
平面优于嵌套式
。(注意,
nested
不同于
chain
chain
)我仍然觉得完全迷路了。现在我让beta有很多不同的值,所以我可以对每个不同的beta和每个alpha求和。。感觉单靠广播是无法克服的。我想回到一个更安全,更可预测的循环和指数等东西。这很酷,我没有想到这一点。我正在尝试学习使用numpy的惯用方法,我想安迪L.已经给出了上面的说明。