ufunc 'subtract' не содержал цикла с совпадающими типами подписи (dtype('S21'), dtype('S21')) -> dtype('S21')

Этот вопрос может показаться дубликатом: Python: ufunc 'add' не содержит цикла с сигнатурой, соответствующей типам dtype('S21') dtype('S21') dtype('S21') Но представленное выше решение не работает.

В настоящее время я работаю над https://github.com/executable16/audio-fingerprint-identifying-python, поэтому я не стал вставлять сюда весь код. Я получаю ошибку в основном:

Traceback (most recent call last):
  File "recognize-from-microphone.py", line 139, in <module>
    matches.extend(find_matches(channel))
  File "recognize-from-microphone.py", line 132, in return_matches
    yield (sid, offset - mapper[hash])
numpy.core._exceptions.UFuncTypeError: ufunc 'subtract' did not contain a loop with signature matching types (dtype('S21'), dtype('S21')) -> dtype('S21')
sqlite - connection has been closed
make: *** [Makefile:22: recognize-listen] Error 1

На мой взгляд, это исключение на самом деле очень мало говорит о том, в чем здесь дело. Я пробовал другие решения от SO, но они, похоже, не работали.

Точная строка ошибки: yield (sid, offset - mapper[hash]) Типы sid, offset и mapper[hash] равны <class 'int'> <class 'bytes'> and <class 'numpy.int64'> соответственно.

Любое решение этой проблемы с надлежащим объяснением было бы действительно полезно.


person ATUL MALAKAR    schedule 20.04.2020    source источник
comment
Согласно сообщению об ошибке, обе переменные в вычитании являются массивами с S21 dtype, т.е. байтовыми строками.   -  person hpaulj    schedule 20.04.2020


Ответы (1)


Я могу воспроизвести вашу ошибку с помощью:

In [144]: type(b'123')                                                                                 
Out[144]: bytes
In [145]: type(np.int64(3))                                                                            
Out[145]: numpy.int64
In [146]: b'123'-np.int64(3)                                                                           
---------------------------------------------------------------------------
UFuncTypeError                            Traceback (most recent call last)
<ipython-input-146-bd8d8c3ec2cd> in <module>
----> 1 b'123'-np.int64(3)

UFuncTypeError: ufunc 'subtract' did not contain a loop with signature matching types (dtype('S21'), dtype('S21')) -> dtype('S21')

Переменная np.int64 взяла на себя «управление» и преобразовала bytes в массив, где bytestring dtype является общим dtype.

Если вместо этого mapper[hash] выдаст число Python, мы получим ошибку вроде:

In [147]: b'123'-3                                                                                     
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-147-04d1219bd464> in <module>
----> 1 b'123'-3

TypeError: unsupported operand type(s) for -: 'bytes' and 'int'

Объект bytes не поддерживает вычитание. Только * и +:

In [149]: b'123'*3                                                                                     
Out[149]: b'123123123'

Сначала преобразование bytes в число может решить вашу проблему:

In [150]: int(b'123')-np.int64(3)                                                                      
Out[150]: 120
person hpaulj    schedule 20.04.2020
comment
Я пробовал: yield (sid, int (offset) - mapper [hash]) Ошибка предоставления -> ValueError: недопустимый литерал для int () с базой 10: b'\xf2\x1a\x00\x00\x00\x00\x00\ х00' - person ATUL MALAKAR; 21.04.2020
comment
Эта строка байтов не представляет число, - person hpaulj; 21.04.2020
comment
Значение смещения, при котором возникает ошибка: b'S\x1b\x00\x00\x00\x00\x00\x00' Я понятия не имею, что это за значение и как преобразовать его в int. - person ATUL MALAKAR; 21.04.2020