2015-03-20 13 views
5

Tôi đang xây dựng một vector thưa thớt sử dụng một scipy.sparse.csr_matrix như vậy:scipy khó hiểu "không thể chuyển đổi số nguyên vô hướng" lỗi

csr_matrix((values, (np.zeros(len(indices)), indices)), shape = (1, max_index)) 

này hoạt động tốt cho hầu hết các dữ liệu của tôi, nhưng đôi khi tôi nhận được một ValueError: could not convert integer scalar.

này tái tạo các vấn đề:

In [145]: inds 

Out[145]: 
array([ 827969148, 996833913, 1968345558, 898183169, 1811744124, 
     2101454109, 133039182, 898183170, 919293479, 133039089]) 

In [146]: vals 

Out[146]: 
array([ 1., 1., 1., 1., 1., 2., 1., 1., 1., 1.]) 

In [147]: max_index 

Out[147]: 
2337713000 

In [143]: csr_matrix((vals, (np.zeros(10), inds)), shape = (1, max_index+1)) 
... 

    996   fn = _sparsetools.csr_sum_duplicates 
    997   M,N = self._swap(self.shape) 
--> 998   fn(M, N, self.indptr, self.indices, self.data) 
    999 
    1000   self.prune() # nnz may have changed 

ValueError: could not convert integer scalar 

inds là một mảng np.int64vals là một mảng np.float64.

Phần có liên quan của mã số sum_duplicates scipy là here.

Lưu ý rằng công trình này:

In [235]: csr_matrix(([1,1], ([0,0], [1,2])), shape = (1, 2**34)) 
Out[235]: 

<1x17179869184 sparse matrix of type '<type 'numpy.int64'>' 
    with 2 stored elements in Compressed Sparse Row format> 

Vì vậy, vấn đề không phải là một trong những khía cạnh là > 2^31

Bất kỳ suy nghĩ tại sao những giá trị cần được gây ra một vấn đề?

+0

hãy thử sử dụng '2 ** 31' và' 2 ** 31-1' với cùng ví dụ bạn đã đăng. – matiasg

+0

có, dữ liệu mẫu tôi đã đăng hoạt động với '2 ** 31-1' nhưng không phải 2 ** 31 – Rok

Trả lời

1

Có thể là max_index> 2 ** 31 không? Hãy thử điều này, chỉ để chắc chắn:

csr_matrix((vals, (np.zeros(10), inds/2)), shape = (1, max_index/2))

+0

có, đây cũng là suy nghĩ đầu tiên của tôi - nhưng nó hoạt động với các dữ liệu tương tự khác sử dụng cùng' max_index' – Rok

+0

không, 'scipy.sparse.csr_matrix' hoạt động tốt với' max_index> 2 ** 31' - xem câu hỏi đã chỉnh sửa. – Rok

+0

@Rok Tôi thực sự có ngoại lệ khác (sử dụng Python 2.7 + scipy 0.9.0). Tôi có thể xây dựng ma trận với '2 ** 31-1' nhưng không phải với' 2 ** 31'. Bạn đang sử dụng phiên bản scipy nào? – matiasg

0

Chỉ số tối đa bạn đang đưa ra là ít hơn so với chỉ số tối đa của các hàng bạn đang cung cấp.

Điều này sparse.csr_matrix((vals, (np.zeros(10), inds)), shape = (1, np.max(inds)+1)) hoạt động tốt với tôi.

Mặc dù thực hiện một .todense() kết quả do lỗi bộ nhớ cho các kích thước lớn của ma trận

+0

tốt, không - giá trị lớn nhất trong mảng chỉ mục là 2101454109 nhưng 'max_index' là 2337713001. Khi thứ nguyên quá nhỏ, nó sẽ ném chỉ mục' ValueError: column vượt quá lỗi ma trận '. Mặc dù bạn có quyền sử dụng 'inds.max() + 1' hoạt động. Các âm mưu dày. – Rok

+0

Rất tiếc, tôi đã tính số không ít hơn. BTW, cho tôi bất cứ điều gì lớn hơn 2 ** 32-1 không hoạt động (ví dụ của bạn không thành công).Nó ném một ngoại lệ lạ, NotImplementedError: Sai số hoặc kiểu đối số cho hàm quá tải 'coo_tocsr'. Tôi đang sử dụng phân phối sinh viên enthought, phiên bản scipy: '0.13.3' – Ars3nous

+0

Tôi đoán phiên bản của bạn đang sử dụng số nguyên 32 bit sau đó? – Rok

0

uncommenting các sum_duplicates - chức năng sẽ dẫn đến sai sót khác. Nhưng sửa lỗi này: strange error when creating csr_matrix cũng giải quyết được vấn đề của bạn. Bạn có thể mở rộng phiên bản_check lên các phiên bản mới hơn của scipy.

import scipy 
import scipy.sparse 
if scipy.__version__ in ("0.14.0", "0.14.1", "0.15.1"): 
    _get_index_dtype = scipy.sparse.sputils.get_index_dtype 
    def _my_get_index_dtype(*a, **kw): 
     kw.pop('check_contents', None) 
     return _get_index_dtype(*a, **kw) 
    scipy.sparse.compressed.get_index_dtype = _my_get_index_dtype 
    scipy.sparse.csr.get_index_dtype = _my_get_index_dtype 
    scipy.sparse.bsr.get_index_dtype = _my_get_index_dtype 
Các vấn đề liên quan