在Python与Matlab中减去3D numpy数组

时间:2014-07-03 15:04:38

标签: python matlab python-3.x numpy

我有两个3D numpy数组,我想找出它们之间的区别。

>>>A.dtype
dtype('uint32')
>>>B.dtype
dtype('uint32')
>>>A.shape
(86, 50, 108)
>>>B.shape
(86, 50, 108)    
>>>A.min()
0
>>>B.min()
0
>>>A.max()
89478487
>>>B.max()
89115767

现在,如果我们A - B

>>> diff = abs( A-B );
>>> diff.min()
0
>>> diff.max()
4294967292

考虑到两个矩阵的minmax值,我们不能将4294967292作为差异矩阵的最大值。 我也在Matlab中完成了类似的操作,差异diff和最大值diff.max()是一致的。什么是A-B操作正在做什么?我的理解是,相互相加,相加,相乘和除数的默认行为是元素操作,但这里有一些有趣的事情发生。

2 个答案:

答案 0 :(得分:4)

您正在使用无符号32位整数。所以你得到了溢出

>>> numpy.uint32(0) - numpy.uint32(1)
4294967295

尝试更改数组以输入int ...

>>> A = numpy.array([0,1,2],'uint32')
>>> B = numpy.array([1,2,3],'uint32')
>>> A-B
array([4294967295, 4294967295, 4294967295], dtype=uint32)
>>> A = A.astype(int)
>>> B = B.astype(int)
>>> A-B
array([-1, -1, -1])

答案 1 :(得分:3)

从另一个中减去无符号整数是有点问题的(除非你确定结果是积极的开始)。那么,为什么不使用有符号整数呢?

diff = abs( A.astype('int32') - B.astype('int32') )

然而,即使这种转换也不会像Matlab那样给出结果:因为对于unsigned int类型,Matlab将结果剪辑为零。例如(Matlab):

>> uint32(4)-uint32(5)

ans =

0
在python中

不是 4294967295 所以,如果你想模仿Matlab的行为,你需要剪切结果

 >>> A = numpy.array([ 1,2,3], dtype='uint32')
 >>> B = numpy.array([2,2,2], dtype='uint32')
 >>> numpy.clip( A.astype(int) - B.astype(int), 0, numpy.iinfo(int).max )
 array([0, 0, 1])