Неожиданное поведение: np.abs () / abs не работает, работая со списками / массивом numpy - PullRequest
0 голосов
/ 19 декабря 2018

предположим, что у нас есть пустой массив

[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

ЗДЕСЬ Вы можете видеть, четыре члена, первый - np.abs(number) массива, второй - простое число, третий - индексчетвертого - это общее количество элементов в массиве.

РЕДАКТИРОВАТЬ 2

хорошо, так что еще одна странная вещь.

так, как яупоминалось ранее, что теперь я использую простой цикл for для нахождения максимального числа, но np.abs() не идентифицировал его.

я теперь использовал * - 1 для преобразования его в положительное число, и оно работаетсейчас .. проверь это.enter image description here так что же это такое?

1 Ответ

0 голосов
/ 21 декабря 2018

Я дошел до терминала.Я был не прав abs (-32768) int16 возвращает -32768.

Самый простой способ продолжить - это преобразовать массив 'music' в int32.

Альтернативой может быть использование uint16.

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

вернет 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)
...