Tôi tin rằng trong nhiều trường hợp Python có thể thay thế Matlab. Trên trang này, tôi sẽ cố gắng giải thích sự khác biệt giữa Matlab và Python, và giải thích tại sao tôi thích Python hơn.
Bản phân phối Python khoa học
Nhưng trước tiên, một vài liên kết để giúp bạn bắt đầu nhanh chóng. Bạn có thể viết mã Python chỉ trong vài phút
Cách dễ nhất để bắt đầu với tính toán khoa học trong Python là sử dụng một trong các bản phân phối. Bằng cách đó, bạn tự động nhận được hầu hết các gói khoa học quan trọng. Một số bản phân phối cũng đi kèm với IDE
- Pyzo, bản phân phối miễn phí dựa trên Python 3, đi kèm với Trình chỉnh sửa tương tác cho Python [IEP]
- python[x,y] và WinPython là hai bản phân phối miễn phí dựa trên Spyder IDE
- Anaconda, bản phân phối Python của Continuum. Phiên bản [cộng đồng] miễn phí cũng có sẵn
- EPD, Bản phân phối Python của Enthughts. Một phiên bản miễn phí cũng có sẵn
Python so với Matlab [sự kiện]
Dưới đây là sơ đồ minh họa sự khác biệt chính giữa Python và Matlab. Python, theo định nghĩa, là một ngôn ngữ lập trình. Cách triển khai phổ biến nhất là trong C [còn được gọi là CPython] và là thứ thường được gọi là "Python". Ngoài ngôn ngữ lập trình và trình thông dịch, Python còn bao gồm một thư viện tiêu chuẩn phong phú. Thư viện này nhằm mục đích lập trình nói chung và chứa các mô-đun cho nội dung cụ thể của os, luồng, mạng, cơ sở dữ liệu, v.v.Matlab là một ngôn ngữ lập trình và môi trường tính toán số phổ biến, xem thêm trên wiki. Khái niệm Matlab đề cập đến toàn bộ gói, bao gồm cả IDE. Thư viện tiêu chuẩn không chứa nhiều chức năng lập trình chung nhưng bao gồm đại số ma trận và một thư viện mở rộng để xử lý dữ liệu và vẽ đồ thị
Để có chức năng tương tự trong Python, bạn sẽ cần các gói NumPy, SciPy và Matplotlib. Scipy là một gói có mục tiêu cung cấp tất cả các chức năng khác của Matlab, bao gồm cả những chức năng trong hộp công cụ Matlab [bạn sẽ phải trả thêm phí trong Matlab]. Tuy nhiên, Simulink là một ví dụ không có trong Python. Nếu bạn phụ thuộc vào nó, có lẽ bạn nên gắn bó với Matlab. Có thể trong tương lai, một giải pháp thay thế Python sẽ được tạo ra
Ngoài ra, bạn sẽ cần một IDE. Nhiều pythoneer đến từ môi trường Linux và sử dụng trình bao Python và một trong nhiều trình soạn thảo, nhưng những người đến từ Matlab thường không thích điều này [bao gồm cả tôi]. Có một số IDE có sẵn, một số miễn phí
Vì Python mở và miễn phí nên các bên khác rất dễ dàng thiết kế các gói hoặc công cụ phần mềm khác mở rộng Python. Có thể tạo các ứng dụng bằng bất kỳ thư viện GUI nào của thị trưởng [TK, WX, GTK, QT,. ], sử dụng OpenGL, điều khiển cổng USB của bạn, v.v. Một ví dụ khác là pyrex/cython để nâng cao tốc độ của thuật toán bằng cách chuyển đổi Python sang mã C và py2exe và tương tự để tạo một ứng dụng độc lập từ nguồn của bạn
CẬP NHẬT 12/8/2019. Mathworks đã xóa bài đăng gốc mà blog này nhằm giải quyết vào khoảng thời gian tôi hoàn thành việc viết nó. Tuy nhiên, có thể có những mẹo hữu ích khác có trong sổ tay, vì vậy tôi vẫn đăng nó. Liên kết đến bài viết gốc bên dưới đã được thay thế trên trang web Mathworks bằng các liên kết đến các tính năng tương tác của Python/Matlab
Gần đây tôi đã biết về một nơi họ so sánh MATLAB và Python trong nỗ lực chứng minh rằng MATLAB là ngôn ngữ ưu việt cho tính toán kỹ thuật và khoa học
MATLAB là một ngôn ngữ điện toán hữu ích và mạnh mẽ và hơn thế nữa. Nó được phân phối và sử dụng điển hình thông qua một môi trường phát triển tích hợp [IDE] rất bóng bẩy và có nhiều hộp công cụ bổ trợ cho một loạt các tác vụ điện toán khoa học. Mặc dù một số tuyên bố trong bài đăng là đúng, nhưng phần lớn trong số đó là sai lệch nghiêm trọng
Tôi sẽ cố gắng phản bác lại nhiều tuyên bố đó trong bài đăng này
Yêu cầu đầu tiên là mã MATLAB dễ đọc hơn đối với các nhà khoa học và kỹ sư so với mã Python thực hiện một nhiệm vụ tương tự. Họ sử dụng các ví dụ mã sau đây để minh họa quan điểm của họ và thậm chí còn đi xa hơn để tuyên bố rằng họ là một lỗi trong hoạt động Python
Họ tuyên bố rằng giải pháp Python/NumPy không có kích thước chính xác để hỗ trợ hoạt động của sản phẩm bên ngoài. Điều này là do NumPy trước hết được tạo cho các hoạt động của mảng theo từng phần tử. Cần lưu ý rằng đây là một cú pháp rõ ràng hơn nhiều cho loại tính toán mảng thường được thực hiện trong khoa học dữ liệu, tuy nhiên, ví dụ sau có thể dễ dàng được sửa bằng cách thêm một bộ dấu ngoặc thứ hai để thêm rõ ràng thứ nguyên thứ hai vào . Ban đầu nó sẽ có hình dạng [1, 3] thay vì [3,]. Điều này có thể được nhìn thấy bằng cách nhìn vào thuộc tính hình dạng của mảng
Trong 1]
import numpy as np np.array[[1, 2, 3]].shape
Ra[1]
[3,]
Trong 2]
np.array[[[1, 2, 3]]].shape
Ra[2]
[1, 3]
Mã chính xác hiện tại [không bao gồm câu lệnh
outer = np.dot[col, row] outer3 vì nó đã được tải ở trên]
Trong 3]
row = np.array[[[1, 2, 3]]] col = row.T inner = np.dot[row, col] inner
Ra[3]
array[[[14]]]
Trong [4]
outer = np.dot[col, row] outer
Ra[4]
________số 8_______
Một phàn nàn khác là phép toán
outer = np.dot[col, row] outer4 là một lời gọi hàm thay vì một toán tử tích hợp sẵn. Họ không được biết toán tử
outer = np.dot[col, row] outer5 trong , e. g
Trong [5]
row @ col
Ra[5]
array[[[14]]]
Trong [6]
[3,]0
Ra[6]
________số 8_______
Bây giờ bạn có thể nói rằng toán tử
outer = np.dot[col, row] outer5 không phải là cách chúng ta thường viết toán học ma trận/tenxơ bằng chữ viết tay hoặc khi sắp chữ một cuốn sách hoặc bài báo. Điều đó đúng, nhưng điều đó cũng tương tự đối với toán tử
outer = np.dot[col, row] outer7. Nếu bạn muốn cực kỳ dài dòng, bạn có thể sử dụng ký hiệu chỉ định của Einstien, tôi. e\begin{align} \vec{a} \cdot \vec{b} = \sum_i a_i b_i = a_i b_i, \quad &\mbox{[tích bên trong]} \\ \vec{a} \otimes \vec{b
trong đó quy ước là tổng trên bất kỳ chỉ số lặp lại nào ngụ ý tổng và ký hiệu $\sum$ có thể được bỏ. Điều này có thể được thực hiện thông qua NumPy như
Trong [7]
[3,]2
Ra[7]
[3,]3
cho sản phẩm bên trong và
Trong [8]
[3,]4
Ra[8]
________số 8_______
cho sản phẩm bên ngoài. Tất nhiên, chúng yêu cầu các lệnh gọi hàm tới
outer = np.dot[col, row] outer8, nhưng cú pháp ký hiệu chỉ định tuân theo ký hiệu toán học tensorial được viết một cách tự nhiên
Việc thêm kích thước bổ sung cũng có thể được thực hiện thông qua lập chỉ mục nếu mảng ban đầu không bao gồm đủ kích thước, e. g
Trong [9]
[3,]6
Ra[9]
________số 8_______
Như đã đề cập ở trên, NumPy được thiết kế để tính toán mảng theo từng phần tử và cú pháp này rõ ràng hơn nhiều, e. g
Trong [10]
[3,]8
Ra[10]
[3,]9
Trong [11]
np.array[[[1, 2, 3]]].shape0
Ra[11]
np.array[[[1, 2, 3]]].shape1
Trong [12]
np.array[[[1, 2, 3]]].shape2
Ra[12]
np.array[[[1, 2, 3]]].shape3
Một biểu thức tương đương trong MATLAB yêu cầu sử dụng dấu chấm [. ] trước toán tử nhân
np.array[[[1, 2, 3]]].shape4
Cú pháp này có thể trở nên khó coi trong các biểu thức dài
Hãy xem xét thêm một vài tuyên bố
Các kỹ sư và nhà khoa học xứng đáng có được những công cụ phù hợp với cách họ làm việc. Họ không cần phải điều chỉnh cách họ làm việc để phù hợp với công cụ của họ
Các hàm Python thường được thiết kế và ghi lại bởi các lập trình viên cao cấp dành cho các lập trình viên có kinh nghiệm khác
Định nghĩa của một lập trình viên cao cấp là không chính xác và chủ quan. Họ có ngụ ý rằng MATLAB không được thiết kế và ghi lại bởi các lập trình viên cao cấp không? . g. NumPy và SciPy được phát triển bởi các kỹ sư. Nhà phát triển cốt lõi ban đầu của cả hai gói đó là Travis Oliphant, một kỹ sư điện được đào tạo, khi ông còn là sinh viên cao học và sau đó là giáo sư kỹ thuật điện. Mặc dù chúng tôi không biết chính xác ai đang viết mã Matlab, nhưng các gói Python khoa học được phát triển mở trên Github, nơi bạn có thể xem hồ sơ của từng người đóng góp. Hãy tự mình xem xét, ngoài Oliphant, người đóng góp lớn thứ hai là Charles Harris, chuyên gia vật lý và nhà toán học [cha và mẹ của ngành kỹ thuật. ], người đóng góp lớn thứ ba là David Cournapeau, một kỹ sư điện và nhà khoa học dữ liệu, v.v.
Môi trường phát triển Python cho máy tính khoa học thiếu độ tin cậy và tích hợp của máy tính để bàn MATLAB
Bạn đã bao giờ nghe nói về Spyder IDE chưa?
Trông rất giống MATLAB
Mọi thứ về MATLAB được thiết kế dành riêng cho các kỹ sư và nhà khoa học
- Tên hàm và chữ ký quen thuộc và dễ nhớ, khiến chúng dễ viết cũng như dễ đọc
Điều này cũng đúng với NumPy và SciPy, nhiều tên giống hệt với MATLAB tương đương
Các giao diện chức năng mới trải qua một quy trình thiết kế nghiêm ngặt, thường bao gồm hàng chục đến hàng trăm giờ dành cho nhà phát triển cho mỗi chức năng
Vì vậy, bạn nói. Tôi có thể xem bộ thử nghiệm của bạn không? . Điều tương tự cũng xảy ra với SciPy và hầu hết phần còn lại của bộ Python khoa học
Khám phá và lặp lại
Họ tuyên bố
Môi trường máy tính để bàn được điều chỉnh cho quy trình công việc khoa học và kỹ thuật lặp lại
Có nhiều tùy chọn trong thế giới Python cung cấp giống nhau, Spyder như đã đề cập, PyCharm IDE và tất nhiên là Project Jupyter đáng kính với JupyterLab và Jupyter Notebooks
Các công cụ tích hợp hỗ trợ khám phá dữ liệu và chương trình đồng thời, cho phép bạn khám phá nhiều ý tưởng hơn trong thời gian ngắn hơn
Một lần nữa Spyder, PyCharm và JupyterLab cung cấp nhiều tính năng tương tự được tích hợp sẵn và thêm vào đó là thế giới tiện ích mở rộng đang phát triển cho Jupyter Notebooks và JupyterLab, e. g. một trình gỡ lỗi trực quan. Chưa kể đến việc dễ dàng tạo bảng điều khiển tương tác trong Jupyter Notebooks, tôi. e
Trong [36]
np.array[[[1, 2, 3]]].shape5
np.array[[[1, 2, 3]]].shape6
Tài liệu
Tài liệu được viết cho các kỹ sư và nhà khoa học, không phải nhà khoa học máy tính
Hãy so sánh tài liệu từ hai chức năng tương tự. Đầu tiên từ NumPy
Trong [14]
np.array[[[1, 2, 3]]].shape7
Ra[14]
Bây giờ từ MATLAB
Trong [15]
np.array[[[1, 2, 3]]].shape8
Ra[15]
Không thể hiểu lập luận ở đây. Cả hai tài liệu chức năng đều rõ ràng như nhau trong phần giải thích. Và điều này cũng đúng với tất cả các chức năng trong NumPy và SciPy
học máy
Tiếp theo họ trích dẫn một khách hàng
"Là một kỹ sư quy trình, tôi không có kinh nghiệm về mạng lưới thần kinh hoặc máy học. Tôi đã nghiên cứu các ví dụ MATLAB để tìm ra các chức năng học máy tốt nhất cho trường hợp sử dụng đo lường dự đoán của chúng tôi. Tôi không thể làm điều này bằng C hoặc Python—sẽ mất quá nhiều thời gian để tìm, xác thực và tích hợp các gói phù hợp. "
-Emil Schmitt-Weaver, ASML
Tôi không thể tranh luận với tuyên bố liên quan đến ngôn ngữ lập trình C. Tuy nhiên, trong hệ sinh thái Python, chúng tôi có Scikit-Learn, đây có thể là khung học máy được sử dụng nhiều nhất trên thế giới. Tài liệu cực kỳ phong phú với nhiều ví dụ và hướng dẫn. Bao gồm là sơ đồ cực kỳ hữu ích này để hỗ trợ chọn mô hình học máy để áp dụng
khi được xem từ trang web tài liệu gốc, các công cụ ước tính khác nhau bao gồm các siêu liên kết đến tài liệu cho từng phương pháp
Scikit-learning, NumPy, SciPy, Spyder IDE, Jupyter Notebooks và hơn 100 gói và công cụ hữu ích khác đều có trong Bản phân phối Python Anaconda miễn phí. Nó có thể được cài đặt trên tất cả các hệ điều hành máy tính chính [Windows, Linux, MacOS] với thời gian tải xuống và cài đặt nhanh hơn nhiều so với bản phân phối cơ bản của MATLAB. Nó bao gồm một trình khởi chạy ứng dụng thuận tiện cho các IDE/Jupyter Notebooks/JupyterLab khác nhau, v.v. Bắt đầu với ngăn xếp máy tính khoa học Python không thể dễ dàng hơn là sử dụng Phân phối Anaconda
Ứng dụng và bảng điều khiển
Tiếp theo, họ giới thiệu Ứng dụng MATLAB và tuyên bố rằng "Python không cung cấp các ứng dụng quy trình làm việc tích hợp cho các ứng dụng khoa học và kỹ thuật". Chà, điều đó đúng theo nghĩa là chúng không được tích hợp vào bất kỳ loại phân phối nào. Nhiều Ứng dụng MATLAB mà họ trích dẫn cũng không phải là một phần của bản phân phối MATLAB tiêu chuẩn, chúng được cung cấp dưới dạng các sản phẩm riêng biệt để mua. Điều này đúng với Hộp công cụ lắp đường cong chẳng hạn
Tuy nhiên, vì Python có cơ sở người dùng tổng thể lớn hơn nhiều, nên có rất nhiều ví dụ về các ứng dụng phức tạp được xây dựng bằng các công cụ nguồn mở có sẵn miễn phí, chẳng hạn như. g. Nhà thám hiểm taxi thành phố New York. Trên thực tế, chúng ta có thể xây dựng một giao diện người dùng đơn giản để điều chỉnh đường cong chỉ bằng một vài dòng Python
Trong [16]
np.array[[[1, 2, 3]]].shape9
Ra[16]
Tất nhiên điều này có thể được làm cho nhiều tính năng phong phú hơn, nhưng ý tưởng cơ bản được thể hiện với một lượng mã tối thiểu
yêu cầu tiếp theo
MATLAB giúp tự động hóa toàn bộ quá trình – từ nghiên cứu đến sản xuất
Đây chỉ là một quảng cáo chiêu hàng cho một sản phẩm riêng biệt khác để mua. Lần này dành cho Máy chủ Sản xuất MATLAB. Với các tuyên bố về việc triển khai các ứng dụng MATLAB cho các thiết bị IoT, đám mây, GPU, v.v. Vì Python được cài đặt theo mặc định hoặc dễ dàng thêm vào hầu như mọi máy chủ Linux trên thế giới, các ứng dụng Python cũng có thể được triển khai miễn phí, dễ dàng tới tất cả những nơi này.
về hiệu suất
Họ hiển thị con số này
nhưng không cung cấp mã nguồn hỗ trợ cho việc so sánh. Tất nhiên, nếu họ đang so sánh mã MATLAB được véc-tơ hóa và/hoặc được biên dịch với các vòng lặp
outer = np.dot[col, row] outer9 thuần túy của Python, thì MATLAB sẽ luôn nhanh hơn. Hãy làm một vài so sánh của riêng chúng tôi
Hãy thêm 1 đến một triệu số. Chúng ta sẽ định nghĩa một hàm theo cú pháp Python thuần túy [không có NumPy]
Trong [17]
[1, 3]0
Chúng ta có thể sử dụng lệnh ma thuật IPython
array[[[1, 2, 3], [2, 4, 6], [3, 6, 9]]]0 để định thời gian thực hiện chức năng này và báo cáo một số thống kê
Trong [18]
[1, 3]1
[1, 3]2
Tất nhiên, trong đoạn mã trên, mảng
array[[[1, 2, 3], [2, 4, 6], [3, 6, 9]]]1 được xây dựng lại mỗi lần thông qua vòng lặp
outer = np.dot[col, row] outer9. Chúng ta có thể nhận được hiệu suất cao hơn một chút và cú pháp rõ ràng hơn bằng cách sử dụng Tính năng hiểu danh sách Python
Trong 19]
[1, 3]3
Một lần nữa sử dụng mô-đun
array[[[1, 2, 3], [2, 4, 6], [3, 6, 9]]]0, chúng ta có thể thấy rằng phương pháp hiểu danh sách có phần nhanh hơn
Trong 20]
[1, 3]4
[1, 3]5
Một trong những tuyên bố trong bài báo là tất cả mã MATLAB đều được biên dịch đúng lúc [JIT]. Python có một trình biên dịch tức thời cũng có sẵn thông qua gói Numba. Tất cả những gì chúng ta phải làm là nhập và thêm trình trang trí chức năng một dòng vào mã ở trên để sử dụng nó
Trong [21]
[1, 3]6
Ở đây, chúng tôi thấy hiệu suất tăng thêm với rất ít nỗ lực bằng cách sử dụng trình biên dịch JIT. Tôi gọi hàm một lần để cho phép quá trình biên dịch JIT diễn ra trước khi thực hiện thao tác định thời
Trong [22]
[1, 3]7
[1, 3]8
Cuối cùng, chúng tôi chuyển sang giải pháp đơn giản nhất. Sử dụng mảng NumPy và phát sóng phần bổ sung
Trong [23]
[1, 3]9
Và chúng tôi thấy sự cải thiện khoảng 2 bậc độ lớn
Trong [24]
row = np.array[[[1, 2, 3]]] col = row.T inner = np.dot[row, col] inner0
row = np.array[[[1, 2, 3]]] col = row.T inner = np.dot[row, col] inner1
Cuối cùng, chúng ta có thể đạt được hiệu suất cao hơn một chút bằng cách thêm trình biên dịch JIT [với thực thi song song] vào hàm NumPy. Giống như lần trước, chúng ta sẽ gọi hàm cho phép biên dịch JIT trước khi thực hiện thao tác định thời
Trong [25]
row = np.array[[[1, 2, 3]]] col = row.T inner = np.dot[row, col] inner2
Trong [26]
row = np.array[[[1, 2, 3]]] col = row.T inner = np.dot[row, col] inner3
row = np.array[[[1, 2, 3]]] col = row.T inner = np.dot[row, col] inner4
Có vẻ như chỉ nhanh hơn một chút, nhưng không có nghĩa là như vậy, có lẽ nếu vectơ
array[[[1, 2, 3], [2, 4, 6], [3, 6, 9]]]4 lớn hơn nhiều, chúng ta có thể thấy lợi ích thực sự của việc thực thi song song
Bây giờ chúng ta sẽ viết mã tương tự trong MATLAB, viết một tệp hàm
Trong [27]
row = np.array[[[1, 2, 3]]] col = row.T inner = np.dot[row, col] inner5
row = np.array[[[1, 2, 3]]] col = row.T inner = np.dot[row, col] inner6
và chạy mã từ dòng lệnh. Ở đây, lưu ý rằng tôi phân bổ đối số
array[[[1, 2, 3], [2, 4, 6], [3, 6, 9]]]4 trước và thực hiện lệnh gọi hàm tới
array[[[1, 2, 3], [2, 4, 6], [3, 6, 9]]]6 trước lệnh gọi thứ hai tới
array[[[1, 2, 3], [2, 4, 6], [3, 6, 9]]]7 xung quanh bởi các dấu thời gian
array[[[1, 2, 3], [2, 4, 6], [3, 6, 9]]]8 và
array[[[1, 2, 3], [2, 4, 6], [3, 6, 9]]]9. Điều này là để cho phép bất kỳ quá trình biên dịch JIT nào xảy ra trước khi thử tính thời gian. Chúng tôi không nhận được số liệu thống kê mà
array[[[1, 2, 3], [2, 4, 6], [3, 6, 9]]]0 cung cấp cho chúng tôi, nhưng chúng tôi thấy rằng việc triển khai này nhanh hơn cách tiếp cận Python thuần túy, nhưng chậm hơn mã Numba JIT từ Python và chậm hơn nhiều so với mã NumPy
Trong [28]
row = np.array[[[1, 2, 3]]] col = row.T inner = np.dot[row, col] inner7
row = np.array[[[1, 2, 3]]] col = row.T inner = np.dot[row, col] inner8
Mặc dù đoạn mã trên được viết gần với cách tiếp cận Python thuần túy ở trên, nhưng hầu hết mọi người đều biết rằng việc phân bổ trước các mảng của bạn trong MATLAB có thể tăng tốc mã. Vì vậy, hãy làm điều đó
Trong [29]
row = np.array[[[1, 2, 3]]] col = row.T inner = np.dot[row, col] inner9
array[[[14]]]0
Một chút cải tiến ở đây, nhưng vẫn chưa bằng tốc độ của mã NumPy
Trong [30]
array[[[14]]]1
array[[[14]]]2
Cuối cùng, hãy thử phương pháp vector hóa trong MATLAB
Trong [31]
array[[[14]]]3
array[[[14]]]4
Đây là cách tiếp cận nhanh nhất trong MATLAB;
Trong [32]
array[[[14]]]5
array[[[14]]]6
Bây giờ tôi không khẳng định rằng mã Python/NumPy sẽ luôn nhanh hơn MATLAB. Nhưng không quá khó để tìm thấy một số ví dụ [rất] đơn giản trong đó rõ ràng không phải vậy. Nếu họ định đưa ra những tuyên bố táo bạo như những tuyên bố trong hình trên, họ nên xuất bản mã nguồn của từng triển khai để đảm bảo rằng các mã được viết theo cách bình đẳng tương ứng. Có rất nhiều tối ưu hóa nhỏ có thể được thực hiện bằng cả hai ngôn ngữ để tăng tốc thời gian chạy mã
Những bình luận khác
Họ tiếp tục đưa ra nhiều tuyên bố hơn và báo cáo những nhược điểm có chủ đích của Python, chẳng hạn như thực tế rằng Python là ngôn ngữ máy tính có mục đích chung chứ không phải ngôn ngữ định hướng toán học và ma trận. Đây thực tế là một tài sản, không phải là trở ngại của Python. Bản chất mục đích chung có nghĩa là có nhiều người dùng hơn về tổng thể, điều này có nghĩa là sẽ có nhiều trợ giúp hơn cho người mới bắt đầu. Python được đánh giá cao thứ 5 trên Stack Overflow, trang web hỏi đáp dành cho lập trình viên. Matlab không xuất hiện dưới dạng thẻ trên ít nhất trang đầu tiên của 32 thẻ khác nhau
Họ phàn nàn rằng các công cụ trực quan hóa trong hệ sinh thái Python bị phân mảnh. Vâng, có một số thư viện hữu ích khác nhau để trực quan hóa. Tuy nhiên, Matplotlib là lựa chọn mặc định và bắt chước hầu hết hoặc tất cả các khả năng của MATLAB vì nó được truyền cảm hứng rất nhiều từ nó. Trên thực tế, tôi sẽ khẳng định rằng bất kỳ hình ảnh 2D nào bạn từng thấy đều có thể được sao chép bằng Matplotlib. Xem thư viện ví dụ mở rộng để biết thêm bằng chứng về tuyên bố này. Có những thư viện vẽ đồ thị tuyệt vời khác, chẳng hạn như Bokeh, người tập trung vào việc tạo các số liệu tương tác được hiển thị bằng JavaScript và dành để hiển thị trên các trang web. Chúng có thể bao gồm các ô có thể gọi lại bằng ngôn ngữ Python để cập nhật tương tác thông qua tính toán phức tạp và/hoặc dữ liệu phát trực tuyến theo thời gian thực. Các loại trực quan hóa tương tác này có thể được triển khai miễn phí cho các trang web. Bất kỳ khả năng tương tác nào có sẵn thông qua trực quan hóa MATLAB đều yêu cầu phiên bản MATLAB được cấp phép đang chạy để phục vụ trực quan hóa. Chúng không thể được triển khai, chắc chắn là không miễn phí, cho mọi người thông qua một máy chủ web tiêu chuẩn. Matplotlib và Bokeh có thể được sử dụng có chọn lọc làm phần phụ trợ trong thư viện vẽ sơ đồ thống nhất có tên là Holoviews. Holoviews cho phép bạn tạo các hình ảnh trực quan đẹp mắt với một vài lệnh có thể được hiển thị bằng Bokeh [đối với các số liệu dành cho các trang web] hoặc Matplotlib [đối với các số liệu dành cho các ấn phẩm in] một cách dễ dàng. Nếu bạn thích cách tiếp cận Ngữ pháp đồ họa hơn để trực quan hóa, có những gói tuyệt vời khác như Altair và ggplot. Một lần nữa, sự đa dạng của các lựa chọn là một tài sản, không phải là trở ngại đối với hệ sinh thái Python
Họ tuyên bố rằng "Bộ giải mã MATLAB tạo mã C và C++ di động, có thể đọc được". Một người khác bán quảng cáo chiêu hàng cho một sản phẩm được cung cấp bên ngoài phân phối MATLAB cơ sở. Do tính chất nguồn mở và di động của Python và các gói khoa học Python, thường không có lý do gì để làm điều đó. Toàn bộ khung gói thường có thể được chuyển sang sản xuất với nhu cầu thay đổi bất kỳ thứ gì và chắc chắn không có vấn đề cấp phép mà người ta sẽ gặp phải khi chạy MATLAB. Một trường hợp sử dụng thường xuyên hơn là sử dụng Python để "kết dính" các lệnh gọi hàm C/C++/Fortran từ các thư viện. Chúng tôi đã chứng minh cách chúng tôi có thể đạt được tốc độ mã C gần với Numba và điều đó thường là quá đủ. Có các gói khác như CFFI cho phép bạn viết và biên dịch mã C có thể dễ dàng gọi từ Python. Điều này bao gồm mã gọi các chức năng từ các thư viện khác, chẳng hạn như OpenMP để xử lý song song luồng. Dưới đây là một ví dụ đơn giản, phần quan trọng ở đây là mã C chứa trong đối số
row @ col1. Nó sử dụng OpenMP để làm cho luồng 9 vòng lặp
outer = np.dot[col, row] outersong song
Trong [33]
array[[[14]]]7
array[[[14]]]8
Bây giờ chúng ta có thể biên dịch mã thành thư viện động và CFFI tự động tạo trình bao bọc giao diện Python
Trong [34]
array[[[14]]]9
outer = np.dot[col, row] outer0
Đây là đoạn script ngắn gọi hàm. Bắt chước hành vi của các hàm
array[[[1, 2, 3], [2, 4, 6], [3, 6, 9]]]6 ở trên
Trong [35]
outer = np.dot[col, row] outer1
outer = np.dot[col, row] outer2
Tất nhiên, cái này nhanh hơn tất cả trừ hàm
row @ col4 ở trên [về cơ bản chúng có cùng tốc độ] vì cả hai đều có mã đối tượng tương đương
Cuối cùng, hầu hết các đối số còn lại trong bài đăng của họ đều đưa ra các tuyên bố liên quan đến việc thiếu các tính năng tích hợp trong Python. Tôi cho rằng họ đang nói về ngôn ngữ Python cốt lõi và điều này rất dễ gây hiểu lầm trong bối cảnh Điện toán khoa học vì không có công việc nào hoạt động trong không gian này cố gắng làm như vậy với Python thuần túy, mọi người đều sử dụng các thư viện được thảo luận trong bài đăng này và thông thường, mọi người đều
Bài đăng này có thể được truy cập ở dạng ban đầu dưới dạng sổ ghi chép Jupyter tại đây. Tất nhiên, bạn sẽ cần cài đặt MATLAB đang chạy và có thể phải thay đổi đường dẫn tệp thành tệp thực thi để các ô mã này có thời gian MATLAB hoạt động bình thường