python总结2d数组得到1d数组

时间:2014-08-29 07:22:01

标签: python numpy numerical-integration

假设我有一个2d数组(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 即可。这是一个例子,数组通常不相等,并且没有本例中的对称性。 我想,迭代将是一个糟糕的选择,因为这些数组非常大。

2 个答案:

答案 0 :(得分:2)

z[w == 3].sum()

w == 3构建一个布尔数组,表示w的哪个位置有3个。z[w == 3]给出了与这些位置对应的z元素数组,{{1} 1}}添加它们。你会在NumPy tutorial中学到很多这类东西,你会在NumPy reference中学到更多东西。

答案 1 :(得分:1)

这似乎是使用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.]