Nếu tôi đang sử dụng định dạng sparse.lil_matrix, làm thế nào tôi có thể loại bỏ một cột khỏi ma trận một cách dễ dàng và hiệu quả?Làm cách nào để loại bỏ một cột khỏi ma trận thưa thớt một cách hiệu quả?
Trả lời
Tôi đã muốn điều này bản thân mình và trong sự thật không có một cách tích hợp tuyệt vời để làm điều đó được nêu ra. Đây là một cách để làm điều đó. Tôi đã chọn tạo một lớp con của lil_matrix và thêm hàm remove_col. Nếu bạn muốn, thay vào đó bạn có thể thêm hàm removeecol vào lớp lil_matrix trong tệp lib/site-packages/scipy/sparse/lil.py
của bạn. Đây là mã:
from scipy import sparse
from bisect import bisect_left
class lil2(sparse.lil_matrix):
def removecol(self,j):
if j < 0:
j += self.shape[1]
if j < 0 or j >= self.shape[1]:
raise IndexError('column index out of bounds')
rows = self.rows
data = self.data
for i in xrange(self.shape[0]):
pos = bisect_left(rows[i], j)
if pos == len(rows[i]):
continue
elif rows[i][pos] == j:
rows[i].pop(pos)
data[i].pop(pos)
if pos == len(rows[i]):
continue
for pos2 in xrange(pos,len(rows[i])):
rows[i][pos2] -= 1
self._shape = (self._shape[0],self._shape[1]-1)
Tôi đã dùng thử và không thấy bất kỳ lỗi nào. Tôi chắc chắn nghĩ rằng nó là tốt hơn so với cắt cột ra, mà chỉ cần tạo ra một ma trận mới theo như tôi biết.
Tôi cũng đã quyết định thực hiện chức năng xóa bỏ, nhưng tôi không nghĩ rằng nó hoạt động tốt như removecol. Tôi bị giới hạn bởi việc không thể xóa một hàng khỏi một ndarray theo cách mà tôi muốn. Đây là loại bỏ có thể được thêm vào lớp trên
def removerow(self,i):
if i < 0:
i += self.shape[0]
if i < 0 or i >= self.shape[0]:
raise IndexError('row index out of bounds')
self.rows = numpy.delete(self.rows,i,0)
self.data = numpy.delete(self.data,i,0)
self._shape = (self._shape[0]-1,self.shape[1])
Có lẽ tôi nên gửi các chức năng này vào kho lưu trữ Scipy.
def removecols(W, col_list):
if min(col_list) = W.shape[1]:
raise IndexError('column index out of bounds')
rows = W.rows
data = W.data
for i in xrange(M.shape[0]):
for j in col_list:
pos = bisect_left(rows[i], j)
if pos == len(rows[i]):
continue
elif rows[i][pos] == j:
rows[i].pop(pos)
data[i].pop(pos)
if pos == len(rows[i]):
continue
for pos2 in xrange(pos,len(rows[i])):
rows[i][pos2] -= 1
W._shape = (W._shape[0], W._shape[1]-len(col_list))
return W
Chỉ cần viết lại mã của bạn để làm việc với col_list làm đầu vào - có thể điều này sẽ hữu ích cho ai đó.
Tôi mới dùng python nên câu trả lời của tôi có thể sai, nhưng tôi đã tự hỏi tại sao một số thứ như sau sẽ không hiệu quả?
phép nói rằng lil_matrix của bạn được gọi mat và rằng bạn muốn loại bỏ các thứ i cột:
mat=hstack([ mat[:,0:i] , mat[:,i+1:] ])
Bây giờ ma trận sẽ chuyển sang một coo_matrix sau đó nhưng bạn có thể biến nó trở lại lil_matrix. Ok, tôi hiểu rằng điều này sẽ phải tạo ra hai ma trận bên trong hstack trước khi nó chuyển nhượng cho biến mat để nó sẽ giống như có ma trận ban đầu cộng thêm một ma nữa cùng một lúc nhưng tôi đoán nếu sparsity là đủ lớn sau đó tôi nghĩ rằng không nên có bất kỳ vấn đề bộ nhớ (kể từ khi bộ nhớ (và thời gian) là toàn bộ lý do của việc sử dụng ma trận thưa thớt).
Điều này trông giống như một câu hỏi không phải là câu trả lời. –
Đơn giản hơn và nhanh hơn nhiều. Bạn thậm chí có thể không cần chuyển đổi sang csr, nhưng tôi chỉ biết chắc chắn rằng nó hoạt động với các ma trận thưa thớt csr và chuyển đổi giữa không phải là một vấn đề.
from scipy import sparse
x_new = sparse.lil_matrix(sparse.csr_matrix(x)[:,col_list])
Đối với một ma trận thưa thớt csr (X) và một danh sách các chỉ số để thả (index_to_drop):
to_keep = list(set(xrange(X.shape[1]))-set(index_to_drop))
new_X = X[:,to_keep]
Nó rất dễ dàng để chuyển đổi lil_matrices để csr_matrices. Kiểm tra tocsr() trong lil_matrix documentation
Lưu ý rằng việc chuyển từ các ma trận csr sang lil bằng tolil() rất tốn kém. Vì vậy, sự lựa chọn này là tốt khi bạn không cần phải có ma trận của bạn trong định dạng lil.
Bằng cách nhìn vào các ghi chú cho mỗi ma trận thưa thớt, đặc biệt là trong trường hợp của chúng tôi là ma trận csc nó có những ưu điểm sau như được liệt kê trong tài liệu [1]
- phép tính số học hiệu quả CSC + CSC, CSC * CSC, vv .
- cột hiệu quả slicing
- sản phẩm vector ma trận nhanh (CSR, BSR có thể nhanh hơn)
Nếu bạn có các chỉ số cột bạn wa nt để loại bỏ, chỉ cần sử dụng slicing. Để xóa các hàng sử dụng ma trận csr vì nó có hiệu quả trong việc cắt hàng
- 1. Làm cách nào để loại bỏ zeroes hiệu quả khỏi ma trận (không thưa thớt)?
- 2. Làm cách nào để loại bỏ hiệu quả các cột khỏi ma trận thưa thớt chỉ chứa số không?
- 3. cách hiệu quả để tạo ra một ma trận thưa thớt chéo
- 4. Cách hiệu quả để chuẩn hóa một Ma trận thưa thớt Scipy
- 5. Làm cách nào để tính phương sai của cột của ma trận thưa thớt trong Scipy?
- 6. cách hiệu quả để lấy tối đa mỗi hàng cho ma trận thưa thớt lớn
- 7. Hiệu quả tích lũy một tập hợp các ma trận scipy thưa thớt
- 8. tối thiểu của ma trận thưa thớt?
- 9. Làm thế nào để Matlab transpose một ma trận thưa thớt?
- 10. Tạo ma trận đường chéo thưa từ hàng của ma trận thưa thớt
- 11. R: chuyển đổi ma trận thưa thớt
- 12. Cách tốt nhất để lưu trữ ma trận thưa thớt trong .NET
- 13. Đảo ngược ma trận thưa thớt lớn với scipy
- 14. Scarse thưa thớt ... mảng?
- 15. Thư viện ma trận thưa thớt cho Ruby
- 16. csv vào ma trận thưa thớt trong python
- 17. Thư viện Fortran 90/95 cho ma trận thưa thớt?
- 18. Làm thế nào để song song các phép nhân ma trận thưa thớt scipy
- 19. Hoạt động ma trận thưa thớt trên CUDA
- 20. Ma trận thưa thớt scipy - mục đích và cách sử dụng các triển khai khác nhau
- 21. Eigen chuyển đổi ma trận dày đặc thành thưa thớt một
- 22. Cách thêm một cột vào ma trận?
- 23. Hình chữ nhật tối đa tổng trong một ma trận thưa thớt
- 24. Có cách nào hiệu quả để ghép các ma trận scipy.sparse không?
- 25. Cách hiệu quả nhất để lặp qua ma trận Eigen
- 26. Cách chuyển numpy.matrix hoặc mảng thành ma trận thưa thớt scipy
- 27. Lưu trữ ma trận lớn nhưng cấp thấp hiệu quả
- 28. dễ dàng lấy mẫu của vectơ từ một ma trận thưa thớt, và tạo ra một ma trận mới từ mẫu (python)
- 29. nhân ma trận numpy để lưu trữ hình tam giác/thưa thớt?
- 30. Xóa hàng và cột khỏi ma trận trong Matlab
Tôi rất vui vì ai đó đang cố gắng cải thiện trong lần thử đầu tiên của tôi. Tuy nhiên, dòng 'if min (col_list) = W.shape [1]:' không có ý nghĩa với tôi theo nhiều cách. Đầu tiên, cú pháp không hợp lệ để sử dụng một phép gán trong một đối số if trong Python. Thứ hai, tại sao bạn kiểm tra min của col_list với hình dạng? Tôi nghĩ rằng có lẽ bạn muốn làm 'nếu max (col_list)> = W.shape [1]:'? Tất nhiên, điều đó có nghĩa là bạn không thể sử dụng các chỉ số tiêu cực và không có bất kỳ kiểm tra nào cho các chỉ số dưới 0 và phải làm gì với chúng. –