試してみると
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
の使い方は何ですか?また、どの状況でそれを使用するべきですか?
簡単に言えば、 newaxis
NAME _ はを使用して、既存の配列の次元をもう1つのディメンション、使用する場合はonce。したがって、
1D 配列は 2D 配列になります
2D 配列は 3D 配列になります
3D 配列は 4D 配列になります
4D 配列は 5D 配列になります
等々..
これは、1D配列から2D配列へのpromotionを示す視覚的な図解です。
Scenario-1 :explicitly変換したいときに 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 broadcast を何らかの操作の一部として、たとえばいくつかの配列の追加。
例:
次の2つの配列を追加するとします。
x1 = np.array([1, 2, 3, 4, 5])
x2 = np.array([5, 4, 3])
これらをちょうどそのように追加しようとすると、NumPyは以下のValueError
name__を発生させます:
ValueError: operands could not be broadcast together with shapes (5,) (3,)
この状況では、 np.newaxis
を使用して、NumPyが broadcast できるように配列の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]])
注:両方のケースで同じ結果が得られることに注意してください(一方は他方の転置です)。
Scenario-3 :これはシナリオ1と同様です。ただし、 np.newaxis
を複数回使用して、配列をより高次元にpromoteすることができます。このような操作は、高次の配列(i.e。Tensors)で必要になる場合があります。
例:
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
NAME _ は、マルチアレイへの軸の一時的な追加を許可する疑似インデックスとも呼ばれます。
np.newaxis
はスライス演算子を使用して配列を再作成しますが、 np.reshape
は配列を目的のレイアウトに再形成します(寸法が一致すると仮定します。これはmust( reshape
NAME _ が発生するため)。
例
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
name__の1番目と2番目の軸の間に一時的な軸を挿入しました(ブロードキャストを使用するため)。欠落している軸は、ここで np.newaxis
を使用して埋められ、 broadcasting 操作が機能します。
一般的なヒント: np.newaxis
;の代わりにNone
name__を使用することもできます。これらは、実際には 同じオブジェクト です。
In [13]: np.newaxis is None
Out[13]: True
追伸また、この素晴らしい答えを参照してください: newaxis vs reshape to dimension add
np.newaxis
とは何ですか?np.newaxis
は、Python定数None
の単なる別名です。つまり、np.newaxis
を使用する場合は、None
を使用することもできます。
>>> np.newaxis is None
True
None
の代わりにnp.newaxis
を使用するコードを読むのであれば、もっと説明的な記述的です。
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,)
最初の例では、最初の次元のすべての要素を使い、2番目の次元を追加します。
>>> a[:, np.newaxis]
array([[0],
[1],
[2],
[3],
[4],
[5],
[6],
[7],
[8],
[9]])
>>> a[:, np.newaxis].shape
(10, 1)
2番目の例では、最初の次元として次元を追加してから、元の配列の最初の次元のすべての要素を結果配列の2番目の次元の要素として使用します。
>>> 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には非常によく似た機能がもう1つあります。 np.expand_dims
。これは、1つの次元を挿入するためにも使用できます。
>>> np.expand_dims(a, 1) # like a[:, np.newaxis]
>>> np.expand_dims(a, 0) # like a[np.newaxis, :]
しかし、shape
に1
sを挿入するだけなので、次の次元を追加するために配列を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
を使用して1次元配列を表示したい場合です。
NumPyに配列をブロードキャストさせたい場合。次元を追加することで、例えば、1つの配列のすべての要素間の違いを取得できます:a - a[:, np.newaxis]
。これは、NumPyオペレーションが最後の次元からブロードキャストするために機能します。 1。
NumPyが配列をブロードキャストできるように、必要な次元を追加します。これは、長さ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.]])
あなたは一次元の数のリストから始めました。 numpy.newaxis
を使用すると、それを2行1列の4行からなる2次元マトリックスに変換しました。
その行列を行列の乗算に使用することも、より大きな4 x n行列の構築に含めることもできます。
選択タプル内のnewaxis
オブジェクトは、結果の選択範囲の寸法を拡張する1単位長寸法の役割を果たします。
行マトリックスから列マトリックスへの変換だけではありません。
以下の例を見てください。
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
は単に行から列への変換ではありません。それは行列の次元を増加させ、それゆえ私たちがそれに対してもっと多くの操作をすることを可能にします。