NumPy的差分函数表现奇怪

4

我有一个关于numpy diff的奇怪行为案例:

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 - ali_m
1
这是正确的问题。这是一个溢出错误 - 之前没有发现感觉很傻。我假设列表命令会转换回Python浮点数或其他东西。 - user3684792
1
np.uint8 数组上调用 list() 只会给你一个 np.uint8 标量值的列表。你需要显式地将数组转换为有符号整数类型。 - ali_m
好的,我修好了。谢谢。 - user3684792
3
.astype()是NumPy数组的一个方法,用于将数组中的元素转换为指定数据类型。 - jedwards
1个回答

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()与以下列表推导式相同:

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)

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