web-dev-qa-db-ja.com

2番目の軸に沿った2つの1D `numpy`配列の連結

実行中

import numpy as np
t1 = np.arange(1,10)
t2 = np.arange(11,20)

t3 = np.concatenate((t1,t2),axis=1)

結果として

Traceback (most recent call last):

  File "<ipython-input-264-85078aa26398>", line 1, in <module>
    t3 = np.concatenate((t1,t2),axis=1)

IndexError: axis 1 out of bounds [0, 1)

軸1が範囲外であると報告するのはなぜですか?

9
ricky_hehe

あなたのタイトルはそれを説明しています-1次元配列には2番目の軸がありません!

しかし、私のシステムでは、@Oliver W.sのように、エラーは発生しません。

In [655]: np.concatenate((t1,t2),axis=1)
Out[655]: 
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 11, 12, 13, 14, 15, 16, 17, 18,
       19])

これは私がaxis=0から期待した結果です:

In [656]: np.concatenate((t1,t2),axis=0)
Out[656]: 
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 11, 12, 13, 14, 15, 16, 17, 18,
       19])

配列が1dの場合、concatenateaxisパラメーターを無視するようです。これが1.9バージョンの新しいものなのか、古いものなのかわかりません。

さらに制御するには、必要に応じて配列の次元を拡張するvstackおよびhstackラッパーの使用を検討してください。

In [657]: np.hstack((t1,t2))
Out[657]: 
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 11, 12, 13, 14, 15, 16, 17, 18,
       19])

In [658]: np.vstack((t1,t2))
Out[658]: 
array([[ 1,  2,  3,  4,  5,  6,  7,  8,  9],
       [11, 12, 13, 14, 15, 16, 17, 18, 19]])
10
hpaulj

これは、Numpyの1D配列の表現方法によるものです。 reshape()を使用して次のように機能します。

t3 = np.concatenate((t1.reshape(-1,1),t2.reshape(-1,1),axis=1)

説明:これは、最初に作成されたときの1D配列の形状です。

t1 = np.arange(1,10)
t1.shape
>>(9,)

「np.concatenate」および他の多くの関数は、欠落している次元を好まない。 Reshapeは次のことを行います。

t1.reshape(-1,1).shape
>>(9,1) 
6
MLKing

Numpyの別の関数 numpy.stack
MATLABの cat のように動作します。

numpy.stack関数は、配列が連結された次元を持つことを要求しません。

4
Royi

これは、1つの次元が連結できないため、2次元に変更する必要があるためです。これにより、空の列を追加できます。次のコードを実行すると機能します。

import numpy as np 
t1 = np.arange(1,10)[None,:]
t2 = np.arange(11,20)[None,:]
t3 = np.concatenate((t1,t2),axis=1)
print(t3)
0
ERIC

2列の配列が必要な場合は、column_stackを使用できます。

import numpy as np
t1 = np.arange(1,10)
t2 = np.arange(11,20)
np.column_stack((t1,t2))

どの結果

[[ 1 11]
 [ 2 12]
 [ 3 13]
 [ 4 14]
 [ 5 15]
 [ 6 16]
 [ 7 17]
 [ 8 18]
 [ 9 19]]