Khi nào ndarray.T được cập nhật? [bản sao]

Sep 24 2020

Trong Numpy, bạn có thể chuyển đổi a ndarraybằng transpose()phương thức, nhưng nó cũng có một thuộc tính T.

Khi a ndarraybị thay đổi, không chỉ giá trị trả về của transpose()phương thức mà cả thuộc tính Tcũng được cập nhật tự động cùng lúc.

ndarray.transpose()là một chức năng, vì vậy không có gì phải thắc mắc. Tuy nhiên, Tkhông phải là một hàm, mà chỉ là một thuộc tính, vì vậy nó phải được cập nhật trước khi truy cập.

  1. Tất cả các hàm và phương thức Numpy có cập nhật Tthuộc tính mỗi khi chúng được gọi không?

  2. Nếu vậy, tại sao? Có khả năng là, khi xử lý các ma trận lớn, chi phí tính toán của mọi hoạt động sẽ rất lớn ngay cả khi nó không liên quan đến chuyển vị. Không hợp lý hơn nếu transpose()chỉ gọi khi cần thiết thay vì viết lại Tthuộc tính mỗi lần?

Đây là một ví dụ đơn giản:

>>> import numpy as np
>>> x = np.array([[1, 2, 3],
...               [4, 5, 6]])
...
>>> x
array([[1, 2, 3],
       [4, 5, 6]])
>>> x.T
array([[1, 4],
       [2, 5],
       [3, 6]])

Tất nhiên, hoạt động trên xcũng thay đổi đồng thời x.T. Khi nào được x.Tcập nhật? Đã x.__imul__()làm được?

>>> x *= 100
>>> x
array([[100, 200, 300],
       [400, 500, 600]])
>>> x.T
array([[100, 400],
       [200, 500],
       [300, 600]])

Trả lời

1 kabanus Sep 23 2020 at 22:24

Các Ttài sản đó là giống như .transpose()chỉ là một cái nhìn với hình dạng (và những bước tiến) thay đổi. Bộ nhớ của nội dung thực tế là giống nhau (bạn có thể sử dụng một id(x[0,0])và id(x.T[0,0])ví dụ để xác minh điều này), nhưng các thuộc tính đối tượng cho biết numpycách diễn giải nội dung đó. Đối với mảng 2D, các bước và hình dạng chỉ là phần ngược lại của mảng ban đầu. Để đọc thêm về các bước tiến, hãy xem tài liệu . Đây là lý do tại sao mọi thứ xảy ra ngay lập tức khi nội dung thay đổi - ô nhớ nhận số mới, nhưng cách diễn giải của .Tmảng không thay đổi.