305

やってみると

numpy.newaxis

その結果、x 軸が 0 から 1 の 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され、どのような状況で使用する必要がありますか?

4

4 に答える 4

566

簡単に言えば、一度使用すると、既存の配列の次元をもう 1次元増やすためnumpy.newaxisに使用されます。したがって、

  • 1D配列は2D配列になります

  • 2D配列は3D配列になります

  • 3D配列は4D配列になります

  • 4D配列は5D配列になります

等々..

これは、1D 配列から 2D 配列への昇格を示す視覚的な図です。

newaxis canva ビジュアライゼーション


シナリオ 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 ブロードキャストを利用したい場合 (たとえば、いくつかの配列の追加を行っているとき)。

例:

次の 2 つの配列を追加するとします。

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

この状況では、NumPy がブロードキャストnp.newaxisできるように、配列の 1 つの次元を増やすために使用できます。

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)

代わりにnumpy.expand_dims、直感的なaxiskwarg を使用できます。

# adding new axes at 1st, 4th, and last dimension of the resulting array
In [131]: newaxes = (0, 3, -1)
In [132]: arr_5D = np.expand_dims(arr, axis=newaxes)
In [133]: arr_5D.shape
Out[133]: (1, 5, 5, 1, 1)

np.newaxisと np.reshapeの背景

newaxisマルチ配列への軸の一時的な追加を可能にする疑似インデックスとも呼ばれます。

np.newaxisスライス演算子を使用して配列を再作成し、配列をnumpy.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上記の例では、 (ブロードキャストを使用するために)の 1 番目と 2 番目の軸の間に一時的な軸を挿入しました。欠落している軸は、ブロードキャスト操作を機能np.newaxisさせるために使用してここで埋められます。


一般的なヒント: ;Noneの代わりに使用することもできますnp.newaxisこれらは実際には同じオブジェクトです

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

PS また、この素晴らしい答えを参照してください: newaxis vs reshape to add dimension

于 2016-12-21T16:03:58.580 に答える
12

数値の 1 次元リストから始めました。を使用するnumpy.newaxisと、各行が 1 列の 4 つの行で構成される 2 次元行列に変換されます。

次に、その行列を行列の乗算に使用するか、より大きな 4 xn 行列の構築に含めることができます。

于 2015-03-24T19:30:01.683 に答える