Trong cả MATLAB và Numpy, mảng có thể được lập chỉ mục theo mảng. Tuy nhiên, hành vi là khác nhau. Hãy để tôi giải thích điều này bằng một ví dụ.Lập chỉ mục mảng giống MATLAB với Numpy
MATLAB:
>> A = rand(5,5)
A =
0.1622 0.6020 0.4505 0.8258 0.1067
0.7943 0.2630 0.0838 0.5383 0.9619
0.3112 0.6541 0.2290 0.9961 0.0046
0.5285 0.6892 0.9133 0.0782 0.7749
0.1656 0.7482 0.1524 0.4427 0.8173
>> A([1,3,5],[1,3,5])
ans =
0.1622 0.4505 0.1067
0.3112 0.2290 0.0046
0.1656 0.1524 0.8173
NumPy:
In [2]: A = arange(25).reshape((5,5))
In [3]: A
Out[3]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
In [6]: A[[0,2,4], [0,2,4]]
Out[6]: array([ 0, 12, 24])
Bằng chữ: MATLAB chọn hàng và cột, numpy "kéo khóa" hai mảng chỉ mục và sử dụng các bộ để trỏ đến mục.
Làm cách nào để có hành vi MATLAB với Numpy?
Đây là thực sự khá hiệu quả. Nó yêu cầu tạo một mảng tạm thời trong bộ nhớ có thể khá lớn tùy thuộc vào kích thước của mảng mà bạn đang làm việc. Có một số cách hiệu quả hơn để thực hiện việc này, bao gồm cả việc sử dụng hàm trợ giúp ix_. –
Yup, tất cả đều chính xác. Mặt khác, thứ được xây dựng bởi 'ix_' cũng khá lớn, mặc dù tạm thời. Tôi đã thực hiện một số thử nghiệm thời gian cho một mảng 5x5 như trong câu hỏi ban đầu, với các kết quả sau. '[,:] [:,]' nhanh hơn khoảng 25% so với '[ix _()]', nhưng nếu bạn đang sử dụng cùng các chỉ mục mỗi lần thì hãy xây dựng một mảng lập chỉ mục * một lần * với 'ix_' và sử dụng lại nó là khoảng 10 lần nhanh hơn - mặc dù tất nhiên bạn sau đó phải trả một chi phí trong việc sử dụng bộ nhớ. –
np.ix_, trong hầu hết các trường hợp, chỉ sử dụng một lượng bộ nhớ tầm thường vì nó trả về các quan điểm của đối số của nó. Ngoài ra np.ix_ là một hoạt động thời gian không đổi trong khi A [I1,:] [:, I2] là ~ n^2 trong cả thời gian và mức sử dụng bộ nhớ. Nhưng nếu bạn thực sự cần tăng 25% hiệu suất trên mảng 5x5 của mình, bạn phải làm những gì bạn phải làm. –