假设我们有一个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
转换为正数,这是一个非常令人讨厌的行为,这里是屏幕截图。
HERE ,您可以看到四个术语,第一个是数组的np.abs(number)
,第二个是简单数字,第三个是它的索引,第四个是总数数组中的元素。
编辑2
好的,另外一件奇怪的事情。
因此,正如我之前提到的那样,我现在正在使用简单的for
循环来查找最大数量,但是np.abs()
并未识别出最大数量。
答案 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)