[python] numpy.newaxis는 어떻게 작동하며 언제 사용합니까?

내가 시도 할 때

numpy.newaxis

결과는 0에서 1까지의 x 축을 가진 2 차원 플롯 프레임을 제공합니다. 그러나 numpy.newaxis벡터 슬라이스에 사용하려고하면

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

행 벡터를 열 벡터로 변경한다는 점을 제외하고는 같은 것입니까?

일반적으로의 사용은 무엇이며 numpy.newaxis어떤 상황에서 사용해야합니까?



답변

간단히 말해, numpy.newaxis하는 데 사용되는 차원이 증가 하여 기존 배열을 하나 더 차원 사용할 경우, 한 번 . 그러므로,

  • 1D 배열은 2D 배열이됩니다

  • 2D 배열은 3D 배열이됩니다

  • 3D 배열은 4D 배열이됩니다

  • 4D 배열은 5D 배열이됩니다

등등..

다음은 1D 어레이에서 2D 어레이로의 승격 을 나타내는 시각적 설명입니다 .

newaxis 칸바 시각화


시나리오 -1 : 위의 그림과 같이 1D 배열을 행 벡터 또는 열 벡터np.newaxis명시 적으로 변환 하려는 경우 유용 할 수 있습니다 .

예:

# 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)

시나리오 -2 : 일부 어레이를 추가 하는 등 일부 작업의 일부로 numpy 브로드 캐스팅 을 사용하려는 경우

예:

다음 두 배열을 추가한다고 가정 해 봅시다.

 x1 = np.array([1, 2, 3, 4, 5])
 x2 = np.array([5, 4, 3])

이와 같이 추가하면 NumPy가 다음을 발생시킵니다 ValueError.

ValueError: operands could not be broadcast together with shapes (5,) (3,)

이 상황에서 np.newaxisNumPy가 브로드 캐스트 할 수 있도록 배열 중 하나의 차원을 늘리는 데 사용할 수 있습니다 .

In [2]: x1_new = x1[:, np.newaxis]    # x1[:, None]
# now, the shape of x1_new is (5, 1)
# array([[1],
#        [2],
#        [3],
#        [4],
#        [5]])

이제 다음을 추가하십시오.

In [3]: x1_new + x2
Out[3]:
array([[ 6,  5,  4],
       [ 7,  6,  5],
       [ 8,  7,  6],
       [ 9,  8,  7],
       [10,  9,  8]])

또는 배열에 새 축을 추가 할 수도 있습니다 x2.

In [6]: x2_new = x2[:, np.newaxis]    # x2[:, None]
In [7]: x2_new     # shape is (3, 1)
Out[7]:
array([[5],
       [4],
       [3]])

이제 다음을 추가하십시오.

In [8]: x1 + x2_new
Out[8]:
array([[ 6,  7,  8,  9, 10],
       [ 5,  6,  7,  8,  9],
       [ 4,  5,  6,  7,  8]])

참고 : 두 경우 모두 동일한 결과를 얻습니다 (하나는 다른 것의 전치 임).


시나리오 3 : 시나리오 1과 유사합니다. 그러나 배열을 더 높은 차원 np.newaxis으로 승격시키기 위해 두 번 이상 사용할 수 있습니다 . 이러한 연산은 때때로 고차 배열 ( 즉, Tensor )에 필요합니다.

예:

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)

np.newaxis vs np.reshape 에 대한 추가 배경

newaxis 다중 축에 축을 임시로 추가 할 수있는 유사 인덱스라고도합니다.

np.newaxis하면서 배열을 다시 슬라이싱 연산자를 사용하여 np.reshape(그리고 이것이 크기가 일치한다고 가정 고쳐 원하는 레이아웃 어레이가 반드시 a를위한 reshape일어날).

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)

위의 예에서 B(방송 사용) 의 첫 번째 축과 두 번째 축 사이에 임시 축을 삽입했습니다 . 방송 작업이 작동 np.newaxis하도록 누락 된 축이 여기에 채워집니다 .


일반 팁 :None대신사용할 수도 있습니다np.newaxis. 이것들은 실제로 같은 객체 입니다.

In [13]: np.newaxis is None
Out[13]: True

추신 : 또한이 위대한 대답을보십시오 : 치수를 추가하기위한 newaxis 대 모양


답변

무엇입니까 np.newaxis?

np.newaxis파이썬 상수 단지의 별칭입니다 None, 당신이 사용하는 곳마다 그 의미 np.newaxis당신은 또한 사용할 수 있습니다 None:

>>> np.newaxis is None
True

대신에 사용 하는 코드를 읽으면 더 설명 적np.newaxis 입니다 None.

사용하는 방법 np.newaxis?

np.newaxis일반적으로 슬라이스와 함께 사용됩니다. 추가 차원을 배열에 추가하려고 함을 나타냅니다. 의 위치는 np.newaxis치수를 추가하려는 위치를 나타냅니다.

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

첫 번째 예에서는 첫 번째 차원의 모든 요소를 ​​사용하고 두 번째 차원을 추가합니다.

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

두 번째 예는 차원을 첫 번째 차원으로 추가 한 다음 원래 배열의 첫 번째 차원에있는 모든 요소를 ​​결과 배열의 두 번째 차원에있는 요소로 사용합니다.

>>> 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)

마찬가지로 np.newaxis여러 치수를 사용 하여 여러 치수를 추가 할 수 있습니다 .

>>> 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)

대안이 np.newaxis있습니까?

NumPy : np.expand_dims에는 매우 유사한 또 다른 기능이 있으며 , 하나의 차원을 삽입하는 데에도 사용할 수 있습니다.

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

그러나 1s 만 삽입 하면 배열에 다음 치수를 추가 shape할 수도 있습니다 reshape.

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

대부분의 경우 np.newaxis치수를 추가하는 가장 쉬운 방법이지만 대체 방법을 아는 것이 좋습니다.

언제 사용 np.newaxis합니까?

여러 상황에서 유용한 치수를 추가하는 것이 좋습니다.

  • 데이터에 지정된 수의 차원이 있어야하는 경우 예를 들어 matplotlib.pyplot.imshow1D 배열을 표시하는 데 사용하려는 경우 .

  • NumPy가 배열을 브로드 캐스트하도록하려면 예를 들어 차원을 추가하면 한 배열의 모든 요소 간의 차이를 얻을 수 a - a[:, np.newaxis]있습니다. 이는 NumPy 작업이 마지막 차원 1 부터 브로드 캐스트하기 때문에 작동합니다 .

  • NumPy 배열 브로드 캐스트 할 수 있도록 필요한 차원을 추가 합니다. 이것은 각 length-1 차원이 단순히 다른 배열 의 해당 1 차원 길이로 브로드 캐스트되기 때문에 작동합니다 .


1 방송 규칙에 대한 자세한 내용을 보려면 해당 주제에 대한 NumPy 설명서 가 매우 좋습니다. 또한 다음과 같은 예를 포함합니다 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.]])

답변

1 차원 숫자 목록으로 시작했습니다. 을 사용한 후에 numpy.newaxis는 각각 한 열의 4 행으로 구성된 2 차원 행렬로 전환했습니다.

그런 다음 행렬 곱셈에 해당 행렬을 사용하거나 더 큰 4 xn 행렬의 구성에 포함시킬 수 있습니다.


답변

newaxis선택 튜플의 객체 는 결과 선택 의 크기하나의 단위 길이 차원 으로 확장하는 역할을 합니다.

행 행렬을 열 행렬로 변환하는 것이 아닙니다.

아래 예를 고려하십시오.

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

이제 데이터에 새로운 차원을 추가하고

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

              [[4, 5, 6]],

              [[7, 8, 9]]])

newaxis여기에 여분의 차원 이 추가 된 것을 볼 수 있습니다 . x1의 차원은 (3,3)이고 X1_new의 차원은 (3,1,3)입니다.

새로운 차원으로 어떻게 다른 작업을 수행 할 수 있습니까?

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

x1_new와 x2를 추가하면 :

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]]])

따라서 newaxis행을 열 행렬로 변환하는 것이 아닙니다. 행렬의 차원이 커지므로 더 많은 작업을 수행 할 수 있습니다.


답변