2016-07-30 77 views
3

我有numpy的差异的奇怪行为的情况下:numpy的差异怪异的行为

a = list(img_arr[y_coord_1,:]) 
print a 
print np.diff(a) 

>>[62, 62, 62, 62, 62, 62, 62, 62, 63, 62, 96, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 66, 63, 64, 64, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 64, 65, 65, 64, 63, 63, 63, 63, 63, 63, 63, 64, 64, 63, 63, 63, 63, 63, 64, 65, 65, 64, 63, 63, 63, 63] 
>>[ 0 0 0 0 0 0 0 1 255 34 2 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 224 253 1 0 255 
0 0 0 0 0 0 0 0 0 1 1 0 255 255 0 0 0 0 
0 0 1 0 255 0 0 0 0 1 1 0 255 255 0 0 0] 

现在,当我在终端运行此我得到

array([ 0, 0, 0, 0, 0, 0, 0, 1, -1, 34, 2, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -32, -3, 1, 
    0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 
    0, -1, -1, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 
    0, 0, 0, 1, 1, 0, -1, -1, 0, 0, 0]) 

什么样的正确答案事情可能会导致此 - 我在这个脚本中使用其他一些编译库,如果这相关

编辑:我刚刚发现它的负数是错误的 - 而上限是非常可疑欠条。看起来像一个dtype问题。

+4

什么是'a.dtype'?它是否是'np.uint8'? –

+1

这是正确的问题。这是一个溢出错误 - 因为之前没有发现它而感到很愚蠢。我认为list命令会转换回python浮点数或其他东西 – user3684792

+1

在'np.uint8'数组上调用'list()'会给你一个'np.uint8'标量值列表。您需要显式地将您的数组转换为有符号整数类型。 –

回答

2

.tolist()是将数组转换为列表(或嵌套列表)的更好方法。它一直贯穿整个转换过程。 list()只是在一个层次上迭代。由于数组已经可迭代,所以我认为list(anarray)没有任何用处。

开始使用数组:

In [789]: z 
Out[789]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8) 
In [790]: type(list(z)[0]) 
Out[790]: numpy.uint8 

list()是一样的这个list解析:

In [791]: type([i for i in z][0]) 
Out[791]: numpy.uint8 

转换

In [792]: type(z.tolist()[0]) 
Out[792]: int 

为什么您在使用list()正确的列表第一名?你不需要它diff。如果溢出是一个问题,则dtype转换更好。

np.diff将在返回差异之前将列表重新转换为数组。

In [793]: np.diff(z.tolist()) 
Out[793]: array([1, 1, 1, 1, 1, 1, 1, 1, 1]) 
In [794]: np.diff(list(z)) 
Out[794]: array([1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=uint8) 
In [795]: np.diff(z.astype('int')) 
Out[795]: array([1, 1, 1, 1, 1, 1, 1, 1, 1]) 
In [796]: np.diff(z) 
Out[796]: array([1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=uint8) 
In [797]: np.array(list(z)) 
Out[797]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8)