【问题标题】:python summing over 2d array to get a 1d arrayPython求解2D数组以获得1D数组
【发布时间】:2014-10-23 04:20:23
【问题描述】:

假设我有一个二维数组 (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。

问题是做最后一部分的最佳方法是什么?

附注。这是一个示例,数组通常不相等,并且不具有此示例中的对称性。 我猜,迭代将是一个糟糕的选择,因为这些数组非常大。

【问题讨论】:

  • 您必须在math.stackexchange.com 上发布此问题!
  • @Kasra:不,那完全是题外话。
  • 我不确定您尝试计算的积分是否有意义,或者您尝试计算它的方式是否有效。在我看来,您会遇到很多浮点舍入错误的问题,并且您的网格无法捕获w 获取您想要的值的点。
  • 你能推荐一个更好的方法吗?这仅用于绘图目的,并且可以部分满足我的要求,但任何更好的东西都值得尝试。我只有 F(x,y) 的数值。

标签: python numpy numerical-integration


【解决方案1】:
z[w == 3].sum()

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

【讨论】:

  • 好主意,但你能以某种方式在一开始就得到 w 的所有可能的“不同”值吗?我在想 dict,我们怎么加起来?
  • @Ars3nous:你什么意思?如果你想在那里使用不同的值,你可以插入任何你想要的变量或其他表达式来代替3
【解决方案2】:

这看起来是一个使用 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.]

【讨论】:

  • 正是我想要的!这完美地完成了这项工作,并且将整个过程的速度提高了近 1000 倍,几乎是我使用字典时的 1000 倍。
猜你喜欢
  • 1970-01-01
  • 2018-09-16
  • 2020-12-18
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2021-01-28
相关资源
最近更新 更多