Cách viết các hàm MatLab trong Python


Võ Thúy Hà
8 tháng trước
Hữu ích 0 Chia sẻ Viết bình luận 0
Đã xem 5808

Tổng quan

Gần đây trong công việc của mình, tôi đã viết lại các thuật toán được phát triển trong MatLab sang Python , một số hàm không đơn giản để thích nghi, đặc biệt là các hàm mảng được gọi là Mảng di động .

MatLab có API nơi bạn có thể gọi các hàm MatLab thông qua Python. Tuy nhiên, ý tưởng không phải là sử dụng MatLab, nhưng cùng một thuật toán hoạt động theo cùng một cách chỉ sử dụng Python và NumPyGNU Octave cũng có API tương tự như MatLab.

Để duy trì khả năng tương thích, tôi đã tạo các hàm có cùng tên được sử dụng trong MatLab được gói gọn trong một lớp có tên là Precision .

1. Kiểm tra

Tạo bản sao kho lưu trữ và làm theo các hướng dẫn trong tệp README:

Dưới đây tôi sẽ chỉ ra một số ví dụ, chúng được chứa trong các bài kiểm tra đơn vị.

1.1 Bắt đầu Đồng hồ bấm giờ

Đo lường thời gian dành cho chế biến.

from precision import Precision

p = Precision()
p.tic()
for i in range(0, 1000): print(i)
p.toc()

Đầu ra sẽ trông giống như thế này:

: > Elapsed time is 0:0:2 secounds.

1.2 Phần trăm của tập dữ liệu

Điều này được sử dụng để có được một phần trăm. Trong ví dụ dưới đây, chúng tôi đang tạo ra một phạm vi ngày thứ tự bằng cách cắt 5% từ bên trái và 5% từ bên phải.

from datetime import datetime
from precision import Precision

p = Precision()
d = [i for i in p.dtrange(datetime(2018, 6, 12), 
                          datetime(2059, 12, 12), 
                          {'days':1, 'hours':2})]
x = [p.datenum(i.date()) for i in d]

x1 = p.prctile(x, 5)
x2 = p.prctile(x, 95)
r = (x2 - x1)

Đầu ra sẽ trông giống như thế này:

5% lower: 737980.1
5% higher: 751621.9
delta: 13641.800000000047

1.3 Mảng di động (cell2mat)

Điều này chuyển đổi một mảng ô thành một mảng thông thường của kiểu dữ liệu cơ bản.

from precision import Precision

p = Precision()
p.cell2mat([[1, 2], [3, 4]])
p.cell2mat('1 2; 3 4')

Đầu ra sẽ trông giống như thế này:

matrix([[1, 2],
        [3, 4]])

1.4 Mảng di động (num2cell)

Chuyển đổi mảng thành mảng ô với các ô có kích thước phù hợp.

import numpy
from precision import Precision

p = Precision()
x = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], numpy.int64)
p.num2cell(x)

Đầu ra sẽ trông giống như thế này:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

1.5 Chuỗi liên kết (strcat)

Điều này nối chuỗi theo chiều ngang bằng cách sử dụng strcat.

import pandas
from precision import Precision

p = Precision()
df = pandas.DataFrame(data={'A': [1, 2], 'B': [3, 4]}, dtype=numpy.int8)
p.strcat(df, 'B')

Đầu ra sẽ trông giống như thế này:

['3', '4']

1.6 Biểu đồ (histc)

Điều này đếm số lượng giá trị trong x nằm trong mỗi phạm vi bin được chỉ định. Đầu vào, binranges, xác định điểm cuối cho mỗi thùng. Đầu ra, bincounts, chứa số phần tử từ x trong mỗi thùng.

import numpy 
from precision import Precision

p = Precision()
v = numpy.array([[1.5, 2.0, 3], [4, 5.9, 6]], numpy.int64)
p.histc(v, numpy.amax(v) + 1)

Đầu ra sẽ trông giống như thế này:

(array([1, 1, 1, 0, 1, 1, 1]), array([1., 1.71428571, 2.42857143, 
       3.14285714, 3.85714286, 4.57142857, 5.28571429, 6.]))

1.7 Độc đáo

Tìm kiếm các giá trị duy nhất trong một mảng và trả về các chỉ mục, nghịch đảo và đếm.

import numpy 
from precision import Precision

p = Precision()
x = [0, 1, 1, 2, 3, 4, 4, 5, 5, 6, 7, 7, 7]
p.unique(numpy.array([x]))

Đầu ra sẽ trông giống như thế này:

array([[array([0, 1, 2, 3, 4, 5, 6, 7]),
        array([[ 0,  1,  3,  4,  5,  7,  9, 10]]),
        array([0, 1, 1, 2, 3, 4, 4, 5, 5, 6, 7, 7, 7]),
        array([1, 2, 1, 1, 2, 2, 1, 3])]], dtype=object)

1.8 chồng chéo

Tìm kiếm các lớp phủ giữa hai mảng trả về chỉ mục.

import numpy 
from precision import Precision

p = Precision()
x, y = p.overlap2d(numpy.array(['A','B','B','C']), 
                   numpy.array(['C','A','B','C','D']))

Đầu ra sẽ trông giống như thế này:

(array([0, 1, 2, 3]), array([1, 2, 0, 3]))

Cân nhắc

Có những chức năng không chính xác là MatLab nhưng sẽ đóng vai trò hỗ trợ, tôi hy vọng nó có thể giúp được ai đó. Có một bài viết thú vị trong NumPy cho người dùng đang chuyển từ MatLab sang Python.

Hữu ích 0 Chia sẻ Viết bình luận 0
Đã xem 5808