numpy python对2d数组求和以获得1d数组

jtjikinw  于 2023-01-13  发布在  Python
关注(0)|答案(2)|浏览(238)

假设我有一个二维数组(x,y),函数z=F(x,y)的值

x = y = array([ 1.,  2.,  3.,  4.,  5.])

   z= array([[  1.,   2.,   3.,   4.,   5.],
       [  2.,   4.,   6.,   8.,  10.],
       [  3.,   6.,   9.,  12.,  15.],
       [  4.,   8.,  12.,  16.,  20.],
       [  5.,  10.,  15.,  20.,  25.]])

现在我想求的是积分$P(w)=\int F(x,y)\delta(x-y=w)dx dy $对于这个,我通过w = x-y构造w矩阵,得到如下的结果

w= array([[ 0.,  1.,  2.,  3.,  4.],
       [-1.,  0.,  1.,  2.,  3.],
       [-2., -1.,  0.,  1.,  2.],
       [-3., -2., -1.,  0.,  1.],
       [-4., -3., -2., -1.,  0.]])

现在我必须把对应于w的所有z值加起来,假设w = 3,我应该得到4+10=14。

  • 问题是最后一步该怎么做 *
    P.S。这是一个例子,数组一般不相等,也没有这个例子中的对称性。我想迭代是一个糟糕的选择,因为这些数组相当大。
0x6upsns

0x6upsns1#

z[w == 3].sum()

w == 3构建了一个布尔数组,表示w的哪些位置有一个3。z[w == 3]给出了z中对应于这些位置的元素的数组,sum()将它们相加。您将在NumPy tutorial中学到很多这类东西,并且您将在NumPy reference中学到更多。

qvsjd97n

qvsjd97n2#

这里看起来是使用np.unique和numpy的新(v1.8.2)np.add.at函数的好地方:

uvals, uidx = np.unique(w, return_inverse=True)

output = np.zeros_like(uvals)
np.add.at(output, uidx, z.ravel())

print uvals
# [-4. -3. -2. -1.  0.  1.  2.  3.  4.]
print output
# [  5.  14.  26.  40.  55.  40.  26.  14.   5.]

相关问题