ufun c 'вычитание' не содержит al oop с типами соответствия сигнатуры (dtype ('S21'), dtype ('S21')) -> dtype ('S21') - PullRequest
1 голос
/ 20 апреля 2020

Этот вопрос может показаться дубликатом: Python: ufun c 'add' не содержит al oop с типами соответствия сигнатуры 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'> соответственно.

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

1 Ответ

1 голос
/ 20 апреля 2020

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

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 взяла 'control' и преобразовала 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'

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

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

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

In [150]: int(b'123')-np.int64(3)                                                                      
Out[150]: 120
...