Nói một cách đơn giản, numpy.newaxis
được sử dụng để tăng kích thước của mảng hiện có thêm một chiều , khi được sử dụng một lần . Như vậy
Mảng 1D sẽ trở thành mảng 2D
Mảng 2D sẽ trở thành mảng 3D
Mảng 3D sẽ trở thành mảng 4D
Mảng 4D sẽ trở thành mảng 5D
và như thế..
Dưới đây là một minh họa trực quan mô tả việc quảng cáo mảng 1D sang mảng 2D.
Kịch bản-1 : np.newaxis
có thể có ích khi bạn muốn chuyển đổi rõ ràng một mảng 1D thành một vectơ hàng hoặc một vectơ cột , như được mô tả trong hình trên.
Thí dụ:
# 1D array
In [7]: arr = np.arange(4)
In [8]: arr.shape
Out[8]: (4,)
# make it as row vector by inserting an axis along first dimension
In [9]: row_vec = arr[np.newaxis, :] # arr[None, :]
In [10]: row_vec.shape
Out[10]: (1, 4)
# make it as column vector by inserting an axis along second dimension
In [11]: col_vec = arr[:, np.newaxis] # arr[:, None]
In [12]: col_vec.shape
Out[12]: (4, 1)
Kịch bản-2 : Khi chúng tôi muốn sử dụng phát sóng numpy như một phần của một số hoạt động, ví dụ như trong khi thực hiện thêm một số mảng.
Thí dụ:
Giả sử bạn muốn thêm hai mảng sau:
x1 = np.array([1, 2, 3, 4, 5])
x2 = np.array([5, 4, 3])
Nếu bạn cố gắng thêm những thứ này như thế, NumPy sẽ nêu ra những điều sau ValueError
:
ValueError: operands could not be broadcast together with shapes (5,) (3,)
Trong tình huống này, bạn có thể sử dụng np.newaxis
để tăng kích thước của một trong các mảng để NumPy có thể phát .
In [2]: x1_new = x1[:, np.newaxis] # x1[:, None]
# now, the shape of x1_new is (5, 1)
# array([[1],
# [2],
# [3],
# [4],
# [5]])
Bây giờ, thêm:
In [3]: x1_new + x2
Out[3]:
array([[ 6, 5, 4],
[ 7, 6, 5],
[ 8, 7, 6],
[ 9, 8, 7],
[10, 9, 8]])
Ngoài ra, bạn cũng có thể thêm trục mới vào mảng x2
:
In [6]: x2_new = x2[:, np.newaxis] # x2[:, None]
In [7]: x2_new # shape is (3, 1)
Out[7]:
array([[5],
[4],
[3]])
Bây giờ, thêm:
In [8]: x1 + x2_new
Out[8]:
array([[ 6, 7, 8, 9, 10],
[ 5, 6, 7, 8, 9],
[ 4, 5, 6, 7, 8]])
Lưu ý : Quan sát rằng chúng tôi nhận được cùng một kết quả trong cả hai trường hợp (nhưng một trường hợp là chuyển vị của trường hợp khác).
Kịch bản-3 : Điều này tương tự như kịch bản-1. Nhưng, bạn có thể sử dụng np.newaxis
nhiều lần để quảng bá mảng lên kích thước cao hơn. Một hoạt động như vậy đôi khi là cần thiết cho các mảng thứ tự cao hơn ( ví dụ như Tenors ).
Thí dụ:
In [124]: arr = np.arange(5*5).reshape(5,5)
In [125]: arr.shape
Out[125]: (5, 5)
# promoting 2D array to a 5D array
In [126]: arr_5D = arr[np.newaxis, ..., np.newaxis, np.newaxis] # arr[None, ..., None, None]
In [127]: arr_5D.shape
Out[127]: (1, 5, 5, 1, 1)
Thêm nền tảng về np.newaxis vs np.reshape
newaxis
cũng được gọi là chỉ số giả cho phép bổ sung tạm thời một trục vào đa khung.
np.newaxis
sử dụng toán tử cắt để tái tạo mảng trong khi np.reshape
reshapes mảng để bố trí mong muốn (giả định rằng kích thước phù hợp; Và đây là bắt buộc đối với một reshape
xảy ra).
Thí dụ
In [13]: A = np.ones((3,4,5,6))
In [14]: B = np.ones((4,6))
In [15]: (A + B[:, np.newaxis, :]).shape # B[:, None, :]
Out[15]: (3, 4, 5, 6)
Trong ví dụ trên, chúng tôi đã chèn một trục tạm thời giữa trục thứ nhất và trục thứ hai của B
(để sử dụng phát sóng). Một trục bị thiếu được điền vào đây bằng cách sử dụng np.newaxis
để làm cho hoạt động phát sóng hoạt động.
Mẹo chung : Bạn cũng có thể sử dụngNone
thay thếnp.newaxis
; Đây là những đối tượng trong thực tế.
In [13]: np.newaxis is None
Out[13]: True
PS Cũng xem câu trả lời tuyệt vời này: newaxis vs reshape để thêm kích thước
except that it changes a row vector to a column vector?
Ví dụ đầu tiên không phải là một vectơ hàng. Đó là một khái niệm matlab. Trong python, nó chỉ là một vectơ 1 chiều không có khái niệm hàng hoặc cột. Các vectơ hàng hoặc cột là 2-dimensonal, giống như ví dụ thứ hai