异常行为:np.abs()/ abs在列表/ numpy数组上不起作用

时间:2018-12-19 06:51:09

标签: python arrays numpy max

假设我们有一个numpy数组

[1 -2 -5 -7 -6 5 8] # keep mind the number of elements are close to million here 

每个元素将被转换为二进制数组,并且该数组的长度为->

length of (binary maximum integer value) + 1 # in our case it is 8 ('1000')
                                                # len('1000') + 1 which is 5
   # len + 1 is to give a space to add the value for positive or negative flag i.e. 0 or 5        

会像..

[[0, 0, 0, 0, 1], # 1
 [5, 0, 0, 1, 0], # -2
 ..]

所以,要找到我要做的最高数值

max_num = len(np.binary_repr(max(np.abs(music))) + 1 # music is the array

这给我一个值32767

问题在于32767不是数组中的最大值,而是32768,并且该方法未检测到它。为什么?

并将数字转换为二进制数组->

for _ in music:

    print(np.abs(_), _, i, len(music))

    mate = list('{0:b}'.format(np.abs(_)).zfill(max_num))

    dat = list(map(int, mate))

    if _ < 0:
        fl = 5
    else:
        fl = 0

    muse.append(dat)

    muse[i][0] = fl

    i = i + 1

编辑1

所以,我一直在再次挖掘这个问题。然后我将所有内容更改为简单性,我用一个简单的for循环替换了一个内联语句。

问题是,np.abs()并未将-32768转换为正数,这是一个非常令人讨厌的行为,这里是屏幕截图。 enter image description here

HERE ,您可以看到四个术语,第一个是数组的np.abs(number),第二个是简单数字,第三个是它的索引,第四个是总数数组中的元素。

编辑2

好的,另外一件奇怪的事情。

因此,正如我之前提到的那样,我现在正在使用简单的for循环来查找最大数量,但是np.abs()并未识别出最大数量。

我现在使用* - 1将其转换为正数,并且现在可以使用了。 enter image description here 那是什么?

1 个答案:

答案 0 :(得分:1)

我要去终点站。我错了abs(-32768)int16返回-32768。

最简单的方法很可能是将“音乐”数组转换为int32。

另一种选择是使用uint16

import numpy as np
abs(arr).astype(np.uint16).max()

如果arr中存在-32768,则将返回32768。

Signed 16 bit  -32768 = bin: 1000 0000 0000 0000
Unsigned 16 bit 32768 = bin: 1000 0000 0000 0000

如果我了解您的进一步处理,可能会有所帮助。

a=np.arange(-128*256, 128*256, dtype=np.int16) # All possible int16s
b=abs(a).astype(np.uint16)

In [29]: b.max()
Out[29]: 32768

In [26]: a
Out[26]: array([-32768, -32767, -32766, ...,  32765,  32766,  32767], dtype=int16)

In [27]: b
Out[27]: array([32768, 32767, 32766, ..., 32765, 32766, 32767], dtype=uint16)

In [28]: a<0
Out[28]: array([ True,  True,  True, ..., False, False, False], dtype=bool)

甚至

In [31]: 5*(a<0).astype(np.int16)
Out[31]: array([5, 5, 5, ..., 0, 0, 0], dtype=int16)