본문 바로가기

파이썬/문제해결

TypeError: ufunc 'multiply' did not contain a loop with signature matching types dtype('S32')

TypeError: ufunc 'multiply' did not contain a loop with signature matching types dtype('S32')

처음 이 에러를 보게 된것은

"머신러닝 인 액션" 이라는 책의 예제코드를 테스트하다가 였다.


numpy의 array를 생성한 후 연산할 경우 위와 같은 에러가 발생할 수 있다.


또는 


Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: ufunc 'multiply' did not contain a loop with signature matching types dtype('S32') dtype('S32') dtype('S32')


책의 예제코드를 보자

 
>>> a = numpy.array(datingLabels)
>>> a
array(['3', '2', '1', '1', '1', '1', '3', '3', '1', '3', '1', '1', '2',
       '1', '1', '1', '1', '1', '2', '3', '2', '1', '2', '3', '2', '3',
       '2', '3', '2', '1', '3', '1', '3', '1', '2', '1', '1', '2', '3',
       '3', '1', '2', '3', '3', '3', '1', '1', '1', '1', '2', '2', '1',
       ...
       '3', '1', '3', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
       '2', '2', '3', '2', '2', '2', '2', '2', '1', '3', '3', '3'], 
      dtype='|S1')
>>> 15.0*a
Traceback (most recent call last):
  File "", line 1, in 
TypeError: ufunc 'multiply' did not contain a loop with signature matching types dtype('S32') dtype('S32') dtype('S32')


여기서 dtype(데이터 타입)이 맞질 않아서 생기는 문제이다.


numpy의 데이터 타입은 아래와 링크에서 확인하기 바란다.


https://docs.scipy.org/doc/numpy-1.9.1/user/basics.types.html


위의 문제를 해결하기 위해서는 dtype(데이터 타입)을 변경해주거나 

생성 시 넣어주면 된다.


 
>>> a = numpy.array(datingLabels, dtype=numpy.int32)
>>> a
array([3, 2, 1, 1, 1, 1, 3, 3, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3, 2, 1, 2,
       3, 2, 3, 2, 3, 2, 1, 3, 1, 3, 1, 2, 1, 1, 2, 3, 3, 1, 2, 3, 3, 3, 1,
       1, 1, 1, 2, 2, 1, 3, 2, 2, 2, 2, 3, 1, 2, 1, 2, 2, 2, 2, 2, 3, 2, 3,
       ...
       2, 3, 2, 2, 2, 2, 2, 1, 3, 3, 3], dtype=int32)
>>> a*15.0
array([ 45.,  30.,  15.,  15.,  15.,  15.,  45., 45.,  15.,  45.,  15.,
       ...
      45.,  30.,  30.,  30.,  30.,  30.,  15.,  45.,  45.,  45.])

이제 정상적으로 연산이 되는 것을 확인할 수 있다.