【问题标题】:Numpy and Matlab difference in sum?Numpy和Matlab总和的区别?
【发布时间】:2013-11-15 17:41:36
【问题描述】:

我有一个代码,我正在尝试从 Matlab 转换为 Python,但是求和存在问题:

a=np.arange(1,28).reshape(3,3,3)
print a
print np.sum(np.sum(a,axis=1),axis=2)

给我axis index out of bound error。根据下面的答案,我正在更新这个例子。结果:

a=np.arange(1,28).reshape(3,3,3)
print a
print np.sum(np.sum(a,axis=1),axis=2)

是:

[[[ 1  2  3]
  [ 4  5  6]
  [ 7  8  9]]

 [[10 11 12]
  [13 14 15]
  [16 17 18]]

 [[19 20 21]
  [22 23 24]
  [25 26 27]]]
[ 45 126 207]

但在 Matlab 中相同的代码可以正常工作:

a=1:27
b=reshape(a,[3,3,3])
b(:,:,1)=b(:,:,1)';
b(:,:,2)=b(:,:,2)';
b(:,:,3)=b(:,:,3)';
b
sum(sum(b,2),3)

将给出以下输出: 有什么问题?

b(:,:,1) =

     1     2     3
     4     5     6
     7     8     9


b(:,:,2) =

    10    11    12
    13    14    15
    16    17    18


b(:,:,3) =

    19    20    21
    22    23    24
    25    26    27

ans =

        99
       126
       153

【问题讨论】:

  • 请注意 ab 没有相同的对齐方式。 a[0,1,2] == 6,但b(1,2,3) == 20
  • @DSM,谢谢,但我应该怎么做才能使它们对齐?
  • 如果你在 Matlab 中使用 a=1:27;b=reshape(a,[3,3,3]) 和在 numpy 中使用 a=np.arange(1,28).reshape(3,3,3,order='F'),我认为你会得到相同的数组。或者,您可以使用permute.transpose 在事后修复它。取决于您喜欢哪种索引约定。另请注意,您可以一次对多个轴求和:a.sum((0,2))
  • @Naji 如果对您有帮助,请不要忘记将答案标记为正确。
  • @CiananSims,我在这里没有看到正确的答案。每个答案都对我有一点指导。我主要使用 DSM 的评论。虽然你的答案是最接近的。

标签: python arrays matlab numpy


【解决方案1】:

您的第一个求和是沿列求和,我认为您不需要。

>>> np.sum(a,axis=1)
array([12, 15, 18],
      [39, 42, 45],
      [66, 69, 72]])

改为更改第一个求和的轴。这将产生与您的 matlab 代码相同的答案:

>>> print np.sum(np.sum(a, axis=0), axis=1)
[99, 126, 153]

【讨论】:

  • 谢谢。所以numpy首先对列求和,然后matlab对行求和?确切的机制是什么?
  • sum(a) 在 matlab 中相当于 a.sum(axis=0) 在 NumPy 中。您在对矩阵求和之前在 matlab 中转置矩阵,这就是为什么我必须更改轴以获得相同的结果。
  • 我不喜欢。我认为这有助于他们保持一致。那么,如果我不这样做,那么正确的代码是什么? a.sum(a.sum(axis=1),axis=1)??
  • 玩它,直到你得到你正在寻找的答案。 ;)
【解决方案2】:

我认为问题在于np.sum(a, axis=1) 的结果是一个二维数组。如果您随后尝试沿轴 = 2 求和,您会看到错误,因为二维数组只有轴 0 和轴 1。

例如:

>>> a = np.ones((3,3,3))
>>> np.sum(a, axis=1)
array([[ 3.,  3.,  3.],
       [ 3.,  3.,  3.],
       [ 3.,  3.,  3.]])
>>> np.sum(a, axis=1).shape
(3, 3)
>>> np.sum(np.sum(a, axis=1), axis=1)
array([ 9.,  9.,  9.])

【讨论】:

  • 不幸的是,这仍然没有给出正确的答案。我现在用一个更好的例子来更新我的问题。
猜你喜欢
  • 2020-10-23
  • 2013-09-29
  • 2020-03-28
  • 2013-07-04
  • 2011-12-06
  • 2017-05-12
  • 1970-01-01
  • 2011-10-09
  • 2020-11-06
相关资源
最近更新 更多