Numpy 和 Matlab 的 sum 函数有什么区别?

3

我有一段代码,想要将其从Matlab翻译成Python,但是求和部分出现了问题:

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

我遇到了数组下标越界错误。根据下面的答案,我正在更新这个例子。以下是结果:

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

is:

[[[ 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
@DSM,谢谢,但是我应该具体怎么做才能让它们对齐呢? - Cupitor
1
如果你在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)) - DSM
@Naji 如果有帮助,请不要忘记标记正确答案。 - Cianan Sims
@CiananSims,我在这里没有看到正确的答案。每个答案都给了我一点指导。我主要使用了DSM的评论。尽管你的答案最接近。 - Cupitor
2个回答

2

我认为问题在于np.sum(a, axis=1)的结果是一个二维数组。如果你尝试沿着axis=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.])

不幸的是,这仍然没有给出正确的答案。我现在会用一个更好的例子来更新我的问题。 - Cupitor

2

您的第一个求和是沿着列进行求和,我想您不希望这样。

>>> 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则对行求和?具体的机制是什么? - Cupitor
在Matlab中的sum(a)等同于NumPy中的a.sum(axis=0)。你在对矩阵求和之前需要先转置它们,这就是为什么我必须改变轴以获得相同的结果。 - Cianan Sims
我不太喜欢这样。我认为这会帮助他们保持一致。那如果我不这么做,正确的代码应该是什么?a.sum(a.sum(axis=1),axis=1) - Cupitor
1
玩弄它,直到你得到你想要的答案。 ;) - Cianan Sims

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接