내가 시도 할 때
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 어레이로의 승격 을 나타내는 시각적 설명입니다 .
시나리오 -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.newaxis
NumPy가 브로드 캐스트 할 수 있도록 배열 중 하나의 차원을 늘리는 데 사용할 수 있습니다 .
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, :]
그러나 1
s 만 삽입 하면 배열에 다음 치수를 추가 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.imshow
1D 배열을 표시하는 데 사용하려는 경우 . -
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
행을 열 행렬로 변환하는 것이 아닙니다. 행렬의 차원이 커지므로 더 많은 작업을 수행 할 수 있습니다.