2014-04-30 29 views
6

Tôi đang cố gắng tạo một ma trận thưa thớt rất lớn có hình dạng (447957347, 5027974). Và nó chứa 3,289,288,566 yếu tố.Cách tạo ma trận thưa thớt lớn trong scipy

Nhưng, khi tôi tạo ra một csr_matrix sử dụng scipy.sparse, nó quay trở lại một cái gì đó như thế này:

<447957346x5027974 sparse matrix of type '<type 'numpy.uint32'>' 
    with -1005678730 stored elements in Compressed Sparse Row format> 

Các mã nguồn để tạo ma trận là:

indptr = np.array(a, dtype=np.uint32) # a is a python array('L') contain row index information 
indices = np.array(b, dtype=np.uint32) # b is a python array('L') contain column index information 
data = np.ones((len(indices),), dtype=np.uint32) 
test = csr_matrix((data,indices,indptr), shape=(len(indptr)-1, 5027974), dtype=np.uint32) 

Và, tôi cũng tìm thấy khi tôi chuyển đổi mảng python dài 3 tỷ đến mảng có nhiều mảng, nó sẽ gây ra lỗi:

ValueError:setting an array element with a sequence 

Nhưng, khi tôi tạo ba mảng python dài 1 tỷ, và chuyển đổi chúng thành mảng numpy, sau đó thêm chúng vào. Nó hoạt động tốt.

Tôi đang bối rối.

+1

Thay vì mô tả 'a' và' b', bạn có thể thêm một số mã tạo dữ liệu ví dụ không? – YXD

+0

@Ofey Có lẽ bạn có thể sử dụng coo_matrix để tạo ma trận thưa thớt, có vẻ dễ hơn phương pháp hiện tại của bạn: 'test = coo_matrix ((dữ liệu, (hàng, cols)), shape = (m, n))' –

+0

sử dụng python 32 bit hoặc hệ thống 32 bit? Có vẻ như bạn đang nhấn giới hạn số nguyên có ký 32 bit. – jrennie

Trả lời

8

Bạn đang sử dụng phiên bản SciPy cũ hơn. Trong việc thực hiện ban đầu các ma trận thưa thớt, các chỉ mục được lưu trữ trong biến số int32, ngay cả trên các hệ thống 64 bit. Ngay cả khi bạn xác định chúng là uint32, như bạn đã làm, chúng sẽ được truyền. Vì vậy, bất cứ khi nào ma trận của bạn có nhiều hơn 2^31 - 1 mục nhập không đồng bộ, như trường hợp của bạn, quá trình lập chỉ mục tràn và rất nhiều điều xấu xảy ra. Lưu ý rằng trong trường hợp của bạn số yếu tố âm tính kỳ lạ được giải thích bởi:

>>> np.int32(np.int64(3289288566)) 
-1005678730 

Tin tốt là điều này đã được tìm ra. Tôi nghĩ rằng this là PR có liên quan, mặc dù đã có một số bản sửa lỗi sau đó. Trong mọi trường hợp, nếu bạn sử dụng latest release candidate cho SciPy 0,14, vấn đề của bạn sẽ biến mất.

+0

Nó hoạt động , Thx! Tôi nghĩ rằng nếu scipy để lại một giao diện để thiết lập các chỉ số datatype sẽ là tuyệt vời. Trên thực tế, int64 lãng phí một số không gian;) – Ofey

+2

Scipy (> = 0.14.0) sử dụng kích thước số nguyên nhỏ nhất cần thiết. –

Các vấn đề liên quan