[Numpy, Scipy] np.array, toarray() 차이
from sklearn.feature_extraction.text import CountVectorizer
sent = ['안녕', '감사', '연말', '편지', '눈사람']
vectorizer = CountVectorizer()
bow_vec = vectorizer.fit_transform(sent)
print(type(bow_vec))
# <class 'scipy.sparse.csr.csr_matrix'>
Bow를 테스트해보다가 문득 toarray()와 np.array()의 차이점이 궁금해졌다.
평소 array를 만들 때의 코드는 아래와 같다.
li = [[[1, 2, 3], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]
arr = np.array(li)
np.array와 toarray()의 사용법을 보면 차이점을 알 수 있다.
- np.array(__array__ 메서드가 배열을 반환하는 객체 또는 (중첩된) 시퀀스)
- csr_matrix.toarray()
차이점이 뭘까라는 의문이 든 것 자체가 이상하다.
sort()와 sorted()의 차이점이라면 모를까..!!
array()는 numpy 라이브러리의 메서드이며,
toarray()는 scipy 라이브러리의 메서드이다.
궁금증이 생겼다면 numpy와 scipy 라이브러이의 차이점이 궁금했어야 했다..
(사용법에만 급급하지 말자..!)
해당 변수에 type을 출력해보면 <class 'numpy.ndarray'>와 <class 'scipy.sparse.csr.csr_matrix'>이다.
numpy.org와 scipy.org에서 각 메서드와 사용법을 찾아볼 수 있다.
두 메서드 모두 numpy.ndarray를 반환하지만 어떤 객체를 array로 변환할지의 차이다.
csr_matrix가 __array__메서드가 배열을 반환하는 객체 또는 시퀀스인지 확인하는 방법을 모르겠다..!!!!!
우선 np.array()에 csr_matrix를 넘겨봤다.
아래 코드에서 bow_vec의 type은 <class 'scipy.sparse.csr.csr_matrix'> 이다.
na = np.array(bow_vec)
ta = bow_vec.toarray()
print(type(na))
print('***** np.array(metrix) *****')
print(na)
print(type(ta))
print('***** metrix.toarray() *****')
print(ta)
값이 다르다.
배열은 반복가능하므로 각각을 for문을 실행해보자.
for i in na:
print(i)
iteration over a 0-d array 오류가 발생한다.
0-d array 는 0차원의 배열을 의미한다.
즉, 스칼라다.
배열을 반환하긴 하는데 결국 스칼라다..
Stackoverflow에도 numpy의 0d 배열이 스칼라로 간주되지 않는 이유를 묻는 질문이 있었고
이에 대한 답변엔 어렵게 생각하면 안된다. 정신건강에 좋지 않다는 답변과 수학적으로 같지만 다른 코드로 처리된다는 답이 있었다.
(해당글 : https://stackoverflow.com/questions/773030/why-are-0d-arrays-in-numpy-not-considered-scalar)
csr_matrix.toarray()의 반환값을 반복해보자.
for i in ta:
print(i)
역시 잘 출력된다.
'ML > Numpy' 카테고리의 다른 글
[Numpy] argsort() 사용법 (0) | 2023.01.10 |
---|---|
[Numpy] 스칼라, 벡터, 행렬, 텐서 차이 (0) | 2022.12.16 |
[Numpy] 넘파이 배열(np.array) (0) | 2022.11.09 |