numpy.newaxisはどのように機能し、いつ使用するのですか?


186

私がしようとすると

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ですか?また、どのような状況で使用する必要がありますか?


1
except that it changes a row vector to a column vector? 最初の例は行ベクトルではありません。それはMATLABのコンセプトです。Pythonでは、行や列の概念がない1次元のベクトルです。行または列ベクトルは、第2の実施例と同様に、2- dimensonalある
endolith

回答:


330

簡単に言えば、numpy.newaxisするために使用される寸法を増加することで、既存のアレイのを1つの以上のディメンションを使用する場合、一度。したがって、

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

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

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

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

等々..

これは、1Dアレイから2Dアレイへの昇格を示す視覚的なイラストです。

newaxis canvaの視覚化


シナリオ1np.newaxisあなたがしたいときに便利になるかもしれない、明示的にどちらかに1次元配列に変換する行ベクトルまたは列ベクトル上の写真に示すように、。

例:

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

この状況でnp.newaxisは、NumPyがをブロードキャストできるように、を使用して配列の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複数回使用して、配列をより高い次元に昇格させることができます。このような演算は、より高次の配列(つまり、テンソル)で必要になる場合があります。

例:

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.newaxisnp.reshapeの背景の詳細

newaxis は、軸をマルチアレイに一時的に追加できる疑似インデックスとも呼ばれます。

np.newaxisは、スライスオペレーターを使用して配列を再作成しながらnp.reshape、配列を目的のレイアウトに再形成します(寸法が一致していることを前提とします。これは、が発生するために必要です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(ブロードキャストを使用するために)の最初の軸と2番目の軸の間に一時的な軸を挿入しました。欠落している軸は、ここでブロードキャスト操作を機能np.newaxisせるために使用されます。


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

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

PSまた、この素晴らしい答えを見てください:次元を追加するためのnewaxis vs reshape


3
x1_new + x2とはどのような操作ですか?2つの行列を追加できるのは、それらの次元が同じである場合(または、実際には1つのスカラーのみである場合)だけだと思っていたので、私には奇妙です。
Stephen

2
@Stephen回答でも述べたように、これはNumPy Broadcastingが原因です。
kmario23 2017年

2
これはすばらしい説明です
Valdrinium

2
@valdrinitはあなたに役立つことを嬉しく思います:)
kmario23

1
@ kmario23確かに、帰属は記事の最後の文に隠されています。私がそれを見なかったのも不思議ではありません。私は、この帰属をもってしても、それは境界の盗作だと思います。私の本では、単語ごとのコピーは、同じ作者が異なるプラットフォームに投稿している場合にのみ許容されます。ミディアムの方がいいと思った。
Chiraz BenAbdelkader

29

なにnp.newaxis

np.newaxisPythonの定数のためだけの別名であるNone、あなたが使用してどこにその手段np.newaxisあなたにも使用することができますNone

>>> np.newaxis is None
True

の代わりにを使用するコードを読むと、よりわかりやすくなります。np.newaxisNone

使い方は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:には非常によく似た別の機能がありnp.expand_dims、これを使用して1つの次元を挿入することもできます。

>>> 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に配列をブロードキャストさせたい場合。次元を追加することで、たとえば、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.]])

2番目と3番目の使用例の違いはわかりません。どちらも、NumPyが操作の一部として配列をブロードキャストできるようにすることです。そうでない場合は、ポイントを明確にするために、3番目の使用例の例を追加すると役立ちます。
Chiraz BenAbdelkader

@ChirazBenAbdelkaderええ、区別は実際にはそれほど明確ではありません。3番目のポイントを削除するか、2番目のポイントにマージする必要があるかわかりません。
MSeifert

9

あなたは一次元の数のリストから始めました。を使用するとnumpy.newaxis、それをそれぞれ1列の4行で構成される2次元マトリックスに変換します。

次に、その行列を行列の乗算に使用したり、より大きな4 xn行列の構築に使用したりできます。


5

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行行列から列行列への単なる変換ではありません。行列の次元が増えるので、より多くの操作を実行できます。


1
それは単なるマトリックスではなくndarray、NumPyの用語で機能します。
kmario23 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.