2017-12-16 7 views
0

dtype=object으로 numpy 배열을 희소 배열로 변환하고 싶습니다. csr_matrix. 그러나 이것은 실패합니다. 심지어numpy 객체 배열을 희소 행렬로 변환

csr_matrix(['a', 'b', 'c']) 

같은 오류가 발생 호출 사실

TypeError: no supported conversion for types: (dtype('O'),)

: 스파 스 매트릭스에 대한 호출의

x = np.array(['a', 'b', 'c'], dtype=object) 

csr_matrix(x) # This fails 
csc_matrix(x) # This fails 

모두 다음과 같은 오류가 발생합니다. 스파 스 매트릭스가 object dtype을 지원하지 않습니까?

+0

스파 스 매트릭스에 숫자가 아닌 요소를 포함 할 수 있습니까? –

+0

개체 dtype의 'zero' 요소는 무엇입니까? 'csr' 수학은 객체와 함께 작동하지 않습니다. 제한된 숫자 유형 세트로 컴파일됩니다. 그런 행렬로 무엇을 할 것으로 기대합니까? 문자열조차도 작동하지 않습니다. – hpaulj

+0

음,'None'을'zero' 요소로 기대합니다. 그러나 숫자 형식으로 만 작업하는 것이 좋습니다. – Pavlin

답변

1

당신 x에서 coo 형식 행렬을 생성 할 수있다 :

In [22]: x = np.array([['a', 'b', 'c']], dtype=object) 
In [23]: M=sparse.coo_matrix(x) 
In [24]: M 
Out[24]: 
<1x3 sparse matrix of type '<class 'numpy.object_'>' 
    with 3 stored elements in COOrdinate format> 
In [25]: M.data 
Out[25]: array(['a', 'b', 'c'], dtype=object) 

coo

는 입력 배열을 평탄화 및 data 속성에 할당했다. ( rowcol에는 색인이 있습니다).

In [31]: M=sparse.coo_matrix(x) 
In [32]: print(M) 
    (0, 0) a 
    (0, 1) b 
    (0, 2) c 

그러나 배열로 표시하면 오류가 발생합니다.

In [26]: M.toarray() 
ValueError: unsupported data types in input 

다른 형식으로 변환하려고하면 typeerror가 생성됩니다. 작품의

dok 종류 :

In [28]: M=sparse.dok_matrix(x) 
/usr/local/lib/python3.5/dist-packages/scipy/sparse/sputils.py:114: UserWarning: object dtype is not supported by sparse matrices 
    warnings.warn("object dtype is not supported by sparse matrices") 
In [29]: M 
Out[29]: 
<1x3 sparse matrix of type '<class 'numpy.object_'>' 
    with 3 stored elements in Dictionary Of Keys format> 

문자열 DTYPE 여전히 x.astype('U1')을 좀 더 잘 작동,하지만 csr에 변환에 문제가있다.

큰 선형 대수 문제에 대해 스파 스 행렬이 개발되었습니다. 행렬 곱셈 및 선형 방정식 해법을 수행하는 능력이 가장 중요했습니다. 비 숫자 작업에 대한 응용 프로그램은 최근에 불완전합니다.

+0

통찰력있는 후속 조치에 감사드립니다. – Pavlin

2

나는이 지원됩니다 생각하지 않고 문서가이 말에 조금 부족한 반면, this part of the sources는 표시되어야합니다 : 객체 기반 유형에 대한 요구

# List of the supported data typenums and the corresponding C++ types 
# 
T_TYPES = [ 
    ('NPY_BOOL', 'npy_bool_wrapper'), 
    ('NPY_BYTE', 'npy_byte'), 
    ('NPY_UBYTE', 'npy_ubyte'), 
    ('NPY_SHORT', 'npy_short'), 
    ('NPY_USHORT', 'npy_ushort'), 
    ('NPY_INT', 'npy_int'), 
    ('NPY_UINT', 'npy_uint'), 
    ('NPY_LONG', 'npy_long'), 
    ('NPY_ULONG', 'npy_ulong'), 
    ('NPY_LONGLONG', 'npy_longlong'), 
    ('NPY_ULONGLONG', 'npy_ulonglong'), 
    ('NPY_FLOAT', 'npy_float'), 
    ('NPY_DOUBLE', 'npy_double'), 
    ('NPY_LONGDOUBLE', 'npy_longdouble'), 
    ('NPY_CFLOAT', 'npy_cfloat_wrapper'), 
    ('NPY_CDOUBLE', 'npy_cdouble_wrapper'), 
    ('NPY_CLONGDOUBLE', 'npy_clongdouble_wrapper'), 
] 

많이처럼 들린다. float16과 같은 몇 가지 기본 유형조차도 빠져 있습니다.

+0

아, 고마워요! 나는이 행동에 아주 당황 스러웠다. 그리고 나는 그것이 이것과 같을 것임에 틀림 없었다고 생각했다. 확인해 주셔서 감사합니다! – Pavlin