15

関数r_のnumpyドキュメントで次を読みました。

文字列整数は、コンマで区切られた複数の配列を積み重ねる軸を指定します。コンマで区切られた 2 つの整数の文字列を使用すると、各エントリを 2 番目の整数として強制的に入れる次元の最小数を示すことができます (連結する軸は依然として最初の整数です)。

そして、彼らはこの例を挙げています:

>>> np.r_['0,2', [1,2,3], [4,5,6]] # concatenate along first axis, dim>=2
array([[1, 2, 3],
       [4, 5, 6]])

私は従いません。文字列は正確に'0,2'numpyに何をするように指示しますか?

上記のリンク以外に、この機能に関するドキュメントが他にあるサイトはありますか?

4

3 に答える 3

13

'n,m'r_に沿って連結しaxis=n、少なくともm次元を持つ形状を生成するよう指示します:

In [28]: np.r_['0,2', [1,2,3], [4,5,6]]
Out[28]: 
array([[1, 2, 3],
       [4, 5, 6]])

したがって、軸 = 0 に沿って連結しているため、通常は結果の形状が であると予想されますが、(6,)であるため、形状は少なくとも 2 次元でなければならないことをm=2伝えています。r_代わりに shape を取得します(2,3):

In [32]: np.r_['0,2', [1,2,3,], [4,5,6]].shape
Out[32]: (2, 3)

を増やすとどうなるか見てみましょうm:

In [36]: np.r_['0,3', [1,2,3,], [4,5,6]].shape
Out[36]: (2, 1, 3)    # <- 3 dimensions

In [37]: np.r_['0,4', [1,2,3,], [4,5,6]].shape
Out[37]: (2, 1, 1, 3) # <- 4 dimensions

できることはすべて、 、 、 、 、または などの読みやすい配列構築関数の 1 つを使用して行うこともできますが、の呼び出しが必要r_になる場合もあります。np.concatenatenp.row_stacknp.column_stacknp.hstacknp.vstacknp.dstackreshape

reshape を呼び出しても、これらの他の関数はさらに高速になる可能性があります。

In [38]: %timeit np.r_['0,4', [1,2,3,], [4,5,6]]
10000 loops, best of 3: 38 us per loop
In [43]: %timeit np.concatenate(([1,2,3,], [4,5,6])).reshape(2,1,1,3)
100000 loops, best of 3: 10.2 us per loop
于 2013-01-22T21:39:29.560 に答える
3

文字列 '0,2' は、numpy に軸 0 (最初の軸) に沿って連結し、2 次元配列を確保するのに十分なブラケットで要素をラップするように指示します。次の結果を考慮してください。

for axis in (0,1):
    for minDim in (1,2,3):
        print np.r_['{},{}'.format(axis, minDim), [1,2,30, 31], [4,5,6, 61], [7,8,90, 91], [10,11, 12, 13]], 'axis={}, minDim={}\n'.format(axis, minDim)

[ 1  2 30 31  4  5  6 61  7  8 90 91 10 11 12 13] axis=0, minDim=1

[[ 1  2 30 31]
 [ 4  5  6 61]
 [ 7  8 90 91]
 [10 11 12 13]] axis=0, minDim=2

[[[ 1  2 30 31]]

 [[ 4  5  6 61]]

 [[ 7  8 90 91]]

 [[10 11 12 13]]] axis=0, minDim=3

[ 1  2 30 31  4  5  6 61  7  8 90 91 10 11 12 13] axis=1, minDim=1

[[ 1  2 30 31  4  5  6 61  7  8 90 91 10 11 12 13]] axis=1, minDim=2

[[[ 1  2 30 31]
  [ 4  5  6 61]
  [ 7  8 90 91]
  [10 11 12 13]]] axis=1, minDim=3
于 2013-01-22T21:38:31.127 に答える
3

強調表示した段落は、2 つのコンマで区切られた整数の構文です。これは、3 つのコンマで区切られた構文の特殊なケースです。カンマで区切られた 3 つの構文を理解すると、カンマで区切られた 2 つの構文が理解できます。

この例の同等の 3 つのカンマ区切りの整数構文は次のようになります。

np.r_['0,2,-1', [1,2,3], [4,5,6]]

より良い説明を提供するために、上記を次のように変更します。

np.r_['0,2,-1', [1,2,3], [[4,5,6]]]

上記には 2 つの部分があります。

  1. コンマ区切りの整数文字列

  2. 2 つのカンマ区切りの配列

コンマ区切りの配列は、次の形状をしています。

np.array([1,2,3]).shape
(3,)

np.array([[4,5,6]]).shape
(1, 3)

つまり、最初の「配列」は「1 次元」で、2 番目の「配列」は「2 次元」です。

最初の2in0,2,-1は、それぞれarrayを少なくともアップグレードする必要があることを意味し2-dimensionalます。2 番目arrayは既に2-dimensionalあるため、影響はありません。ただし、最初array1-dimensionaland にするためには2-dimensional np.r_、その形状tupleに 1 を追加して(1,3)またはにする必要があります(3,1)。そこで出番です-1。基本的に、余分な 1 を の形の0,2,-1どこに配置する必要があるかを決定します。がデフォルトで、(または、より多くの寸法が必要な場合は) を形状の前に配置します(理由については後で説明します)。これにより、最初の形状がtuplearray-111stuplearray'stuple(1,3)array'sこれは 2 番目の形状と同じtupleです。0inは、結果の0,2,-1配列を「0」軸に沿って連結する必要があることを意味します。

連結軸 (上記の例では、値が 1 の次元 0) を脇に置くと、両方のarrays残りの次元が等しい (この場合、残りの次元の値はどちらも 3)。そうでない場合、次のエラーが生成されます。tuple(1,3)arraysarrays

ValueError: 連結軸を除くすべての入力配列の次元は正確に一致する必要があります

arrays形状を持つ2つを連結すると(1,3)、結果arrayは形状を持つ(1+1,3) == (2,3)ため、次のようになります。

np.r_['0,2,-1', [1,2,3], [[4,5,6]]].shape
(2, 3)

カンマ区切り文字列の 3 番目の整数に0または正の整数を使用すると、その整数によって、array'sアップグレードされた形状の各形状タプルの開始が決定されます (次元をアップグレードする必要があるtupleもののみ)。arraysたとえば、形状のアップグレードを要求する場合、元の形状はアップグレードされた形状の次元 0 から開始する必要がある0,2,0ことを意味します。はの後に配置されます。これにより、元の形状がアップグレードされた形状の寸法から始まることがわかるように、同じ形状になります。つまり、arraysarray'stupletuplearray [1,2,3]tuple (3,)13tuple(3,1)tuple (3,)0tuple0,2,1[1,2,3]array'sshapetuple (3,)は、アップグレードされた shape タプルの次元 1 から開始する必要があります。これは、1 を次元 0 に配置する必要があることを意味します。結果の形状タプルは になります(1,3)

カンマ区切り文字列の 3 番目の整数に負の数が使用されている場合、負の符号に続く整数によって、元の形状のタプルがどこで終了するかが決まります。元の形状のタプルが である場合、元の形状のタプルは(3,) 0,2,-1アップグレードされた形状のタプルの最後の次元で終了する必要があるため、1 はアップグレードされた形状のタプルの次元 0 に配置され、アップグレードされた形状のタプルは になります(1,3)(3,)アップグレードされた形状タプルの最後の次元でもある、アップグレードされた形状タプルの次元 1 で終了します (元の配列はで[1,2,3]、アップグレードされた配列は です[[1,2,3]])。

np.r_['0,2', [1,2,3], [4,5,6]]

と同じです

np.r_['0,2,-1', [1,2,3], [4,5,6]]

最後に、より多くのディメンションを使用した例を次に示します。

np.r_['2,4,1',[[1,2],[4,5],[10,11]],[7,8,9]].shape
(1, 3, 3, 1)

コンマ区切りの配列は次のとおりです。

[[1,2],[4,5],[10,11]]形のタプルを持つ(3,2)

[7,8,9]形のタプルを持つ(3,)

どちらも にarraysアップグレードする必要があります4-dimensional arrays。元のarray's形状のタプルは、次元 1 から開始する必要があります。

したがって、最初の配列の場合、形状は次元 1 から始まるようになり(1,3,2,1)3,22 つの 1 を追加してそれを作成する必要があるため、4-dimensional1 つは元の形状のタプルの前に配置され、もう 1 つは後に配置されます。

同じロジックを使用すると、2 番目の配列の shape タプルは になり(1,3,1,1)ます。

ここでarrays、連結軸として次元 2 を使用して 2 つを連結する必要があります。各配列のアップグレードされた形状タプルから次元 2 を削除する(1,3,1)と、両方のタプルが得られarraysます。結果のタプルは同一であるため、配列を連結することができ、連結された軸を合計して を生成し(1, 3, 2+1, 1) == (1, 3, 3, 1)ます。

于 2020-01-02T19:17:42.303 に答える