Về cơ bản những gì hàm chuyển đổi làm là hoán đổi hình dạng và bước tiến của mảng:
>>> a = np.ones((1,2,3))
>>> a.shape
(1, 2, 3)
>>> a.T.shape
(3, 2, 1)
>>> a.strides
(48, 24, 8)
>>> a.T.strides
(8, 24, 48)
Trong trường hợp mảng numpy 1D (mảng hạng 1), hình dạng và sải chân là các bộ dữ liệu 1 phần tử và không thể hoán đổi, và chuyển vị của mảng 1D như vậy trả về nó không thay đổi. Thay vào đó, bạn có thể hoán chuyển một "vectơ hàng" (mảng hình numpy (1, n)
) thành một "vectơ cột" (mảng hình numpy (n, 1)
). Để đạt được điều này, trước tiên bạn phải chuyển mảng numpy 1D của mình thành vector hàng và sau đó hoán đổi hình dạng và sải chân (hoán vị nó). Dưới đây là một chức năng thực hiện nó:
from numpy.lib.stride_tricks import as_strided
def transpose(a):
a = np.atleast_2d(a)
return as_strided(a, shape=a.shape[::-1], strides=a.strides[::-1])
Thí dụ:
>>> a = np.arange(3)
>>> a
array([0, 1, 2])
>>> transpose(a)
array([[0],
[1],
[2]])
>>> a = np.arange(1, 7).reshape(2,3)
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>> transpose(a)
array([[1, 4],
[2, 5],
[3, 6]])
Tất nhiên bạn không phải làm theo cách này vì bạn có mảng 1D và bạn có thể định hình lại trực tiếp thành (n, 1)
mảng bằng a.reshape((-1, 1))
hoặc a[:, None]
. Tôi chỉ muốn chứng minh làm thế nào hoán vị một mảng hoạt động.