Hướng dẫn how do you store a large matrix in python? - làm thế nào để bạn lưu trữ một ma trận lớn trong python?

96

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Numpy là một thư viện cực kỳ hữu ích và từ việc sử dụng nó, tôi thấy rằng nó có khả năng xử lý các ma trận khá lớn (10000 x 10000), nhưng bắt đầu đấu tranh với bất cứ thứ gì lớn hơn nhiều (cố gắng tạo ra một ma trận 50000 x 50000 thất bại). Rõ ràng, điều này là do các yêu cầu bộ nhớ lớn.

Có một cách để tạo ra các ma trận khổng lồ trong Numpy (giả sử 1 triệu x 1 triệu) theo một cách nào đó (mà không có một số địa hình ram)?

Hướng dẫn how do you store a large matrix in python? - làm thế nào để bạn lưu trữ một ma trận lớn trong python?

Đã hỏi ngày 28 tháng 6 năm 2009 lúc 0:32Jun 28, 2009 at 0:32

0

Pytables và numpy là con đường để đi.

PyTables sẽ lưu trữ dữ liệu trên đĩa ở định dạng HDF, với nén tùy chọn. Các bộ dữ liệu của tôi thường được nén 10 lần, rất tiện dụng khi giao dịch với hàng chục hoặc hàng trăm triệu hàng. Nó cũng rất nhanh; Máy tính xách tay 5 tuổi của tôi có thể crunch thông qua dữ liệu thực hiện nhóm giống như SQL bằng cách tổng hợp ở mức 1.000.000 hàng/giây. Không tệ cho một giải pháp dựa trên Python!

Truy cập dữ liệu như một lần tái sử dụng một lần nữa cũng đơn giản như:

data = table[row_from:row_to]

Thư viện HDF quan tâm đến việc đọc trong các khối dữ liệu có liên quan và chuyển đổi thành Numpy.

Hướng dẫn how do you store a large matrix in python? - làm thế nào để bạn lưu trữ một ma trận lớn trong python?

Đã trả lời ngày 30 tháng 6 năm 2009 lúc 9:11Jun 30, 2009 at 9:11

Stephen Simmonsstephen SimmonsStephen Simmons

7.5352 Huy hiệu vàng20 Huy hiệu bạc13 Huy hiệu đồng2 gold badges20 silver badges13 bronze badges

3

numpy.array có nghĩa là sống trong ký ức. Nếu bạn muốn làm việc với ma trận lớn hơn RAM của bạn, bạn phải làm việc xung quanh đó. Có ít nhất hai cách tiếp cận bạn có thể làm theo:

  1. Hãy thử một biểu diễn ma trận hiệu quả hơn để khai thác bất kỳ cấu trúc đặc biệt nào mà ma trận của bạn có. Ví dụ, như những người khác đã chỉ ra, có các cấu trúc dữ liệu hiệu quả cho ma trận thưa thớt (ma trận có rất nhiều số không), như scipy.sparse.csc_matrix. that exploits any special structure that your matrices have. For example, as others have already pointed out, there are efficient data structures for sparse matrices (matrices with lots of zeros), like scipy.sparse.csc_matrix.
  2. Sửa đổi thuật toán của bạn để làm việc trên các chương trình con. Bạn chỉ có thể đọc từ đĩa các khối ma trận hiện đang được sử dụng trong các tính toán. Các thuật toán được thiết kế để chạy trên các cụm thường hoạt động theo tỷ lệ, vì dữ liệu được đặt trên các máy tính khác nhau và chỉ được truyền qua khi cần. Ví dụ: thuật toán Fox cho phép nhân ma trận (tệp PDF).. You can read from disk only the matrix blocks that are currently being used in computations. Algorithms designed to run on clusters usually work blockwise, since the data is scatted across different computers, and passed by only when needed. For example, the Fox algorithm for matrix multiplication (PDF file).

Đã trả lời ngày 28 tháng 6 năm 2009 lúc 2:53Jun 28, 2009 at 2:53

2

Bạn sẽ có thể sử dụng numpy.memmap để ánh xạ bộ nhớ một tệp trên đĩa. Với python mới hơn và máy 64 bit, bạn nên có không gian địa chỉ cần thiết mà không tải mọi thứ vào bộ nhớ. HĐH nên xử lý chỉ giữ một phần của tệp trong bộ nhớ.

Đã trả lời ngày 28 tháng 6 năm 2009 lúc 1:46Jun 28, 2009 at 1:46

DopplershiftDopplershiftDopplerShift

4.7381 Huy hiệu vàng21 Huy hiệu bạc19 Huy hiệu đồng1 gold badge21 silver badges19 bronze badges

1

Để xử lý các ma trận thưa thớt, bạn cần gói scipy nằm trên numpy-xem ở đây để biết thêm chi tiết về các tùy chọn ma trận thưa thớt mà scipy cung cấp cho bạn.

Đã trả lời ngày 28 tháng 6 năm 2009 lúc 2:23Jun 28, 2009 at 2:23

Alex Martellialex MartelliAlex Martelli

826K163 Huy hiệu vàng1203 Huy hiệu bạc1382 Huy hiệu Đồng163 gold badges1203 silver badges1382 bronze badges

0

Bài đăng của Stefano Borini đã khiến tôi nhìn vào cách mà mọi thứ đã có.

Đây chính là nó. Nó dường như làm về cơ bản những gì bạn muốn. HDF5 sẽ cho phép bạn lưu trữ các bộ dữ liệu rất lớn, sau đó truy cập và sử dụng chúng theo cùng một cách Numpy làm.

Đã trả lời ngày 28 tháng 6 năm 2009 lúc 2:54Jun 28, 2009 at 2:54

1

Hãy chắc chắn rằng bạn đang sử dụng hệ điều hành 64 bit và phiên bản Python/Numpy 64 bit. Lưu ý rằng trên các kiến ​​trúc 32 bit, bạn có thể giải quyết thông thường 3GB bộ nhớ (với khoảng 1GB bị mất vào bộ nhớ được ánh xạ I/O và như vậy).

Với 64 bit và mọi thứ mảng lớn hơn RAM có sẵn, bạn có thể thoát khỏi bộ nhớ ảo, mặc dù mọi thứ sẽ trở nên chậm hơn nếu bạn phải trao đổi. Ngoài ra, bản đồ bộ nhớ (xem numpy.memmap) là một cách để làm việc với các tệp khổng lồ trên đĩa mà không tải chúng vào bộ nhớ, nhưng một lần nữa, bạn cần có không gian địa chỉ 64 bit để làm việc để sử dụng nhiều. Pytables cũng sẽ làm hầu hết điều này cho bạn.

Đã trả lời ngày 19 tháng 8 năm 2009 lúc 0:27Aug 19, 2009 at 0:27

DWFDWFdwf

3,4331 Huy hiệu vàng19 Huy hiệu bạc24 Huy hiệu đồng1 gold badge19 silver badges24 bronze badges

Đó là một chút alpha, nhưng http://blaze.pydata.org/ dường như đang làm việc để giải quyết vấn đề này.

Đã trả lời ngày 5 tháng 2 năm 2013 lúc 0:58Feb 5, 2013 at 0:58

Wistywistywisty

6,8871 Huy hiệu vàng29 Huy hiệu bạc29 Huy hiệu đồng1 gold badge29 silver badges29 bronze badges

Đôi khi một giải pháp đơn giản là sử dụng một loại tùy chỉnh cho các mục ma trận của bạn. Dựa trên phạm vi số bạn cần, bạn có thể sử dụng thủ công dtype và đặc biệt nhỏ hơn cho các mặt hàng của bạn. Bởi vì Numpy xem xét loại lớn nhất cho đối tượng theo mặc định, đây có thể là một ý tưởng hữu ích trong nhiều trường hợp. Đây là một ví dụ:

In [70]: a = np.arange(5)

In [71]: a[0].dtype
Out[71]: dtype('int64')

In [72]: a.nbytes
Out[72]: 40

In [73]: a = np.arange(0, 2, 0.5)

In [74]: a[0].dtype
Out[74]: dtype('float64')

In [75]: a.nbytes
Out[75]: 32

Và với loại tùy chỉnh:

In [80]: a = np.arange(5, dtype=np.int8)

In [81]: a.nbytes
Out[81]: 5

In [76]: a = np.arange(0, 2, 0.5, dtype=np.float16)

In [78]: a.nbytes
Out[78]: 8

Đã trả lời ngày 3 tháng 10 năm 2016 lúc 22:09Oct 3, 2016 at 22:09

Hướng dẫn how do you store a large matrix in python? - làm thế nào để bạn lưu trữ một ma trận lớn trong python?

MazdakmazdakMazdak

102K18 Huy hiệu vàng157 Huy hiệu bạc183 Huy hiệu đồng18 gold badges157 silver badges183 bronze badges

Bạn đang hỏi làm thế nào để xử lý một ma trận phần tử 2.500.000.000 mà không có Terabyte của RAM?

Cách để xử lý 2 tỷ mặt hàng mà không cần 8 tỷ byte RAM là không giữ ma trận trong bộ nhớ.

Điều đó có nghĩa là các thuật toán tinh vi hơn nhiều để lấy nó từ hệ thống tệp thành từng mảnh.

Eric Wilson

55,8K76 Huy hiệu vàng198 Huy hiệu bạc267 Huy hiệu đồng76 gold badges198 silver badges267 bronze badges

Đã trả lời ngày 28 tháng 6 năm 2009 lúc 2:32Jun 28, 2009 at 2:32

S.LottS.LottS.Lott

377K78 Huy hiệu vàng503 Huy hiệu bạc772 Huy hiệu Đồng78 gold badges503 silver badges772 bronze badges

2

Thông thường khi chúng tôi đối phó với các ma trận lớn, chúng tôi thực hiện chúng dưới dạng ma trận thưa thớt.

Tôi không biết liệu Numpy có hỗ trợ ma trận thưa thớt hay không nhưng tôi đã tìm thấy điều này thay thế.

Đã trả lời ngày 28 tháng 6 năm 2009 lúc 0:45Jun 28, 2009 at 0:45

Nick Dandoulakisnick DandoulakisNick Dandoulakis

41.9K15 Huy hiệu vàng102 Huy hiệu bạc136 Huy hiệu đồng15 gold badges102 silver badges136 bronze badges

Theo như tôi biết về Numpy, không, nhưng tôi có thể sai.

Tôi có thể đề xuất cho bạn giải pháp thay thế này: Viết ma trận trên đĩa và truy cập vào các khối. Tôi đề nghị bạn định dạng tệp HDF5. Nếu bạn cần nó một cách minh bạch, bạn có thể thực hiện lại giao diện Ndarray để phân trang ma trận được lưu trữ đĩa của bạn vào bộ nhớ. Hãy cẩn thận nếu bạn sửa đổi dữ liệu để đồng bộ hóa chúng trên đĩa.

Đã trả lời ngày 28 tháng 6 năm 2009 lúc 0:46Jun 28, 2009 at 0:46

Stefano Borinistefano BoriniStefano Borini

134K95 Huy hiệu vàng287 Huy hiệu bạc417 Huy hiệu đồng95 gold badges287 silver badges417 bronze badges

1

Làm thế nào ma trận được lưu trữ trong Python?

Nó chứa dữ liệu được lưu trữ trong các hàng và cột của mảng.Trong một ma trận Python, chuỗi các mục nằm ngang được gọi là "hàng", trong khi loạt các mục thẳng đứng được gọi là "cột".Các hàng và cột được xếp chồng lên nhau giống như một danh sách lồng nhau.. In a Python matrix, the horizontal series of items are referred to as "rows," while the vertical series of items are referred to as "columns." The rows and columns are stacked over each other just like a nested list.

Làm thế nào để bạn tăng kích thước của một ma trận trong Python?

thay đổi kích thước () với sự trợ giúp của ma trận numpy.Phương thức thay đổi kích thước (), chúng ta có thể thay đổi kích thước hình dạng của ma trận đã cho.Hãy nhớ tất cả các yếu tố nên được đề cập sau khi thay đổi kích thước ma trận đã cho. With the help of Numpy matrix. resize() method, we are able to resize the shape of the given matrix. Remember all elements should be covered after resizing the given matrix.

Làm thế nào để bạn xác định kích thước của một ma trận trong Python?

Sử dụng Len () để có được kích thước của ma trận..
ma trận = [[1, 2]].
Hàng = Len (ma trận) Chiều cao ..
Cột = Len (Ma trận [0]) Chiều rộng ..
print(rows).
print(columns).

Python có tốt cho ma trận không?

Ma trận là một trong những cấu trúc dữ liệu quan trọng có thể được sử dụng trong các tính toán toán học và khoa học.Python không có cách đơn giản để thực hiện kiểu dữ liệu ma trận.Python does not have a straightforward way to implement a matrix data type.