Numpy.newaxis hoạt động như thế nào và khi nào sử dụng nó?


184

Khi tôi cố gắng

numpy.newaxis

kết quả mang lại cho tôi khung vẽ 2 chiều với trục x từ 0 đến 1. Tuy nhiên, khi tôi cố gắng sử dụng numpy.newaxisđể cắt một vectơ,

vector[0:4,]
[ 0.04965172  0.04979645  0.04994022  0.05008303]
vector[:, np.newaxis][0:4,]
[[ 0.04965172]
[ 0.04979645]
[ 0.04994022]
[ 0.05008303]]

Có phải điều tương tự ngoại trừ việc nó thay đổi một vectơ hàng thành một vectơ cột?

Nói chung, việc sử dụng là gì numpy.newaxisvà trong trường hợp nào chúng ta nên sử dụng nó?


1
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
endolith

Câu trả lời:


323

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.

hình ảnh newaxis canva


Kịch bản-1 : np.newaxiscó 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.newaxisnhiề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.newaxissử dụng toán tử cắt để tái tạo mảng trong khi np.reshapereshapes 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 reshapexả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ụngNonethay 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


3
Loại hoạt động nào là x1_new + x2? Nó là lạ đối với tôi bởi vì tôi nghĩ rằng hai ma trận chỉ có thể được thêm vào nếu chúng có cùng kích thước (hoặc nếu một trong số chúng thực sự chỉ là một vô hướng).
Stephen

2
@Stephen Như tôi cũng đã lưu ý trong câu trả lời, đó là vì NumPy Broadcasting.
kmario23

2
Đây là một lời giải thích tuyệt vời
Valdrinium

2
@valdrinit rất vui vì nó hữu ích cho bạn :)
kmario23

1
@ kmario23 Quả thực sự quy kết được ẩn trong câu cuối cùng của bài viết, không có gì lạ khi tôi không nhìn thấy nó. Tôi coi đó là đạo văn biên giới ngay cả với sự quy kết này. Trong cuốn sách của tôi, từ sao chép từ chỉ được chấp nhận nếu cùng một tác giả đăng trên các nền tảng khác nhau. Tôi mong đợi tốt hơn từ Trung bình.
Chiraz BenAbdelkader

29

np.newaxis

Đây np.newaxischỉ là một bí danh cho hằng số Python None, có nghĩa là bất cứ nơi nào bạn sử dụng, np.newaxisbạn cũng có thể sử dụng None:

>>> np.newaxis is None
True

Nó chỉ mang tính mô tả hơn nếu bạn đọc mã sử dụng np.newaxisthay vì None.

Sử dụng np.newaxisnhư thế nào?

Các np.newaxisthường được sử dụng với cắt. Nó chỉ ra rằng bạn muốn thêm một thứ nguyên bổ sung cho mảng. Vị trí của np.newaxisđại diện nơi tôi muốn thêm kích thước.

>>> import numpy as np
>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a.shape
(10,)

Trong ví dụ đầu tiên, tôi sử dụng tất cả các yếu tố từ chiều thứ nhất và thêm chiều thứ hai:

>>> a[:, np.newaxis]
array([[0],
       [1],
       [2],
       [3],
       [4],
       [5],
       [6],
       [7],
       [8],
       [9]])
>>> a[:, np.newaxis].shape
(10, 1)

Ví dụ thứ hai thêm một thứ nguyên làm thứ nguyên đầu tiên và sau đó sử dụng tất cả các phần tử từ thứ nguyên đầu tiên của mảng ban đầu làm các phần tử trong thứ nguyên thứ hai của mảng kết quả:

>>> a[np.newaxis, :]  # The output has 2 [] pairs!
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
>>> a[np.newaxis, :].shape
(1, 10)

Tương tự, bạn có thể sử dụng nhiều np.newaxisđể thêm nhiều thứ nguyên:

>>> a[np.newaxis, :, np.newaxis]  # note the 3 [] pairs in the output
array([[[0],
        [1],
        [2],
        [3],
        [4],
        [5],
        [6],
        [7],
        [8],
        [9]]])
>>> a[np.newaxis, :, np.newaxis].shape
(1, 10, 1)

Có những lựa chọn thay thế np.newaxis?

Có một chức năng rất giống nhau trong NumPy : np.expand_dims, cũng có thể được sử dụng để chèn một chiều:

>>> np.expand_dims(a, 1)  # like a[:, np.newaxis]
>>> np.expand_dims(a, 0)  # like a[np.newaxis, :]

Nhưng với điều kiện là nó chỉ chèn 1s vào trong mảng, shapebạn cũng có thể thêm reshapemảng để thêm các kích thước này:

>>> a.reshape(a.shape + (1,))  # like a[:, np.newaxis]
>>> a.reshape((1,) + a.shape)  # like a[np.newaxis, :]

Hầu hết thời gian np.newaxislà cách dễ nhất để thêm kích thước, nhưng thật tốt khi biết các lựa chọn thay thế.

Khi nào sử dụng np.newaxis?

Trong một số bối cảnh là thêm kích thước hữu ích:

  • Nếu dữ liệu nên có một số kích thước được chỉ định. Ví dụ: nếu bạn muốn sử dụng matplotlib.pyplot.imshowđể hiển thị mảng 1D.

  • Nếu bạn muốn NumPy phát sóng mảng. Ví dụ, bằng cách thêm một thứ nguyên, bạn có thể nhận được sự khác biệt giữa tất cả các thành phần của một mảng : a - a[:, np.newaxis]. Điều này hoạt động vì các hoạt động NumPy phát sóng bắt đầu với chiều thứ 1 cuối cùng .

  • Để thêm một kích thước cần thiết để NumPy có thể phát các mảng. Điều này hoạt động vì mỗi chiều dài 1 chiều chỉ đơn giản được phát theo chiều dài của 1 chiều tương ứng của mảng khác.


1 Nếu bạn muốn đọc thêm về các quy tắc phát sóng, tài liệu NumPy về chủ đề đó là rất tốt. Nó cũng bao gồm một ví dụ với np.newaxis:

>>> a = np.array([0.0, 10.0, 20.0, 30.0])
>>> b = np.array([1.0, 2.0, 3.0])
>>> a[:, np.newaxis] + b
array([[  1.,   2.,   3.],
       [ 11.,  12.,  13.],
       [ 21.,  22.,  23.],
       [ 31.,  32.,  33.]])

Tôi không thấy sự khác biệt giữa các trường hợp sử dụng thứ 2 và thứ 3; cả hai đều cho phép NumPy phát sóng một mảng như một phần của hoạt động. Nếu không, nó sẽ giúp thêm một ví dụ cho trường hợp sử dụng thứ 3 để làm rõ điểm này.
Chiraz BenAbdelkader

@ChirazBenAbdelkader Vâng, sự khác biệt không thực sự khác biệt. Tôi không chắc mình có nên xóa điểm thứ ba hay hợp nhất nó vào điểm thứ hai không.
MSeifert

9

Bạn đã bắt đầu với một danh sách các số một chiều. Khi bạn đã sử dụng numpy.newaxis, bạn biến nó thành một ma trận hai chiều, bao gồm bốn hàng của một cột mỗi cột.

Sau đó, bạn có thể sử dụng ma trận đó để nhân ma trận hoặc tham gia vào việc xây dựng ma trận 4 xn lớn hơn.


5

newaxisđối tượng trong bộ lựa chọn phục vụ để mở rộng kích thước của lựa chọn kết quả theo một chiều dài đơn vị .

Nó không chỉ là chuyển đổi ma trận hàng sang ma trận cột.

Hãy xem xét ví dụ dưới đây:

In [1]:x1 = np.arange(1,10).reshape(3,3)
       print(x1)
Out[1]: array([[1, 2, 3],
               [4, 5, 6],
               [7, 8, 9]])

Bây giờ hãy thêm kích thước mới vào dữ liệu của chúng tôi,

In [2]:x1_new = x1[:,np.newaxis]
       print(x1_new)
Out[2]:array([[[1, 2, 3]],

              [[4, 5, 6]],

              [[7, 8, 9]]])

Bạn có thể thấy rằng newaxisđã thêm kích thước phụ ở đây, x1 có thứ nguyên (3,3) và X1_new có thứ nguyên (3,1,3).

Làm thế nào kích thước mới của chúng tôi cho phép chúng tôi hoạt động khác nhau:

In [3]:x2 = np.arange(11,20).reshape(3,3)
       print(x2)
Out[3]:array([[11, 12, 13],
              [14, 15, 16],
              [17, 18, 19]]) 

Thêm x1_new và x2, chúng tôi nhận được:

In [4]:x1_new+x2
Out[4]:array([[[12, 14, 16],
               [15, 17, 19],
               [18, 20, 22]],

              [[15, 17, 19],
               [18, 20, 22],
               [21, 23, 25]],

              [[18, 20, 22],
               [21, 23, 25],
               [24, 26, 28]]])

Do đó, newaxiskhông chỉ là chuyển đổi hàng thành ma trận cột. Nó làm tăng kích thước của ma trận, do đó cho phép chúng tôi thực hiện nhiều thao tác hơn trên nó.


1
Nó không chỉ là ma trận, nó hoạt động với bất kỳ ndarraythuật ngữ NumPy nào.
kmario23
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.