Giả sử tôi có mảng thưa thớt 2d. Trong usecase thật của tôi cả số lượng hàng và cột là lớn hơn nhiều (nói 20000 và 50000) do đó nó không thể phù hợp trong bộ nhớ khi một đại diện dày đặc được sử dụng:Làm thế nào để nhân một ma trận scipy.sparse một cách yếu tố bằng một mảng dày đặc 1d được phát sóng?
>>> import numpy as np
>>> import scipy.sparse as ssp
>>> a = ssp.lil_matrix((5, 3))
>>> a[1, 2] = -1
>>> a[4, 1] = 2
>>> a.todense()
matrix([[ 0., 0., 0.],
[ 0., 0., -1.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 2., 0.]])
Bây giờ giả sử tôi có một mảng 1d dày đặc với tất cả thành phần không số không với kích thước 3 (hoặc 50000 trong trường hợp thực tế cuộc sống của tôi):
>>> d = np.ones(3) * 3
>>> d
array([ 3., 3., 3.])
tôi muốn tính toán nhân elementwise của a và d bằng cách sử dụng ngữ nghĩa phát thanh truyền hình thông thường của numPy. Tuy nhiên, các ma trận thưa thớt trong scipy là của np.matrix: các '*' điều hành bị quá tải để có nó cư xử giống như một ma trận nhân thay vì elementwise-nhân:
>>> a * d
array([ 0., -3., 0., 0., 6.])
Một giải pháp sẽ được thực hiện ' một' chuyển sang ngữ nghĩa mảng cho '*' nhà điều hành, mà sẽ cung cấp cho các kết quả mong đợi:
>>> a.toarray() * d
array([[ 0., 0., 0.],
[ 0., 0., -3.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 6., 0.]])
Nhưng tôi không thể làm điều đó kể từ khi cuộc gọi đến toArray() sẽ thực hóa các phiên bản dày đặc của 'a' mà không vừa trong bộ nhớ (và kết quả sẽ dày đặc quá):
>>> ssp.issparse(a.toarray())
False
Bất kỳ ý tưởng làm thế nào để xây dựng này trong khi chỉ giữ cơ sở dữ liệu thưa thớt và không cần phải làm một vòng python không hiệu quả trên các cột của 'a'?
Nếu 'd' là ma trận thưa thớt có cùng kích thước với' a' bạn có thể sử dụng 'a.multiply (d)'. Có lẽ bạn có thể tạo một 'd' là N hàng dài và lặp qua N hàng của' một' tại một thời điểm? – mtrw
Nhưng d là dày đặc và không thể được phát sóng rõ ràng trong bộ nhớ để đáp ứng các yêu cầu hình dạng nhân. Looping trên một lô là một lựa chọn nhưng tôi thấy điều này một chút hackish. Tôi đã có thể nghĩ rằng có một vani vectorized/scipy cách để làm điều này mà không có một vòng python. – ogrisel
Tôi đoán vấn đề là bạn muốn đại diện cho một ma trận (thưa thớt) nhưng hoạt động mulitply của một mảng. Tôi nghĩ rằng bạn sẽ phải cuộn của riêng bạn không may. – mtrw