2017-06-30 1 views
0

私はnumpyで1次元配列を持っていますv。私はvのコピーである各行で行列を作るためにそれをコピーしたいと思います。簡単です:np.broadcast_to(v, desired_shape)。私はベクトルとしてvを扱うのが好き、とvのコピーされている各で行列を作ってそれをコピーしたい場合numpy:水平方向にベクトルをブロードキャスト

しかし、私はそれを行うための簡単な方法を見つけることができません。試行錯誤の末、私はこれを行うことができるよ:それは動作しますが

np.broadcast_to(v.reshape(v.shape[0], 1), desired_shape) 

が、私はそれを理解するために主張することはできません(私はそれを書いていても!)。

問題の一部は、numpyが列ベクトルの概念を持たないように見えることです(したがって、数値計算の代わりにreshapeハックが.Tになる)。

しかし、問題の深い部分は、ブロードキャストが水平ではなく垂直にしか動作しないように思われる。あるいは、より正確な言い方は、放送は下位の次元ではなく上位の次元でしか機能しないということです。 それが正しいかどうかわからない。

私は一般的に放送の概念を理解していますが、行列を作るためにcolベクトルをコピーするなど、特定のアプリケーションに使用しようとすると失われます。

を理解していただくか、このコードの可読性を改善するできますか?

+0

numpyのは、行列指向ではありません。あなたが望むなら、それをテンソル指向と考えることができます。 1D配列には、転置のためにスワップする2つの次元がありません。 – user2357112

答えて

1

https://en.wikipedia.org/wiki/Transpose - 転置に関するこの記事は、行列の転置についてのみ述べています。

https://en.wikipedia.org/wiki/Row_and_column_vectors -

列ベクトルまたは列行列は、簡単に行または列を作成することができ

1×mの行列M×1行列 行ベクトルまたは行の行列でありますベクトル(行列):

In [464]: np.array([[1],[2],[3]]) # column vector 
Out[464]: 
array([[1], 
     [2], 
     [3]]) 
In [465]: _.shape 
Out[465]: (3, 1) 

In [466]: np.array([[1,2,3]]) # row vector 
Out[466]: array([[1, 2, 3]]) 
In [467]: _.shape 
Out[467]: (1, 3) 

しかしnumpy基本構造はarrayであり、nがベクトルまたは行列です。

[コンピュータサイエンスの配列] - 一般的に、実行時に計算されたインデックスによって選択可能なデータアイテムのコレクション

numpyアレイは0以上の寸法を有することができます。これとは対照的に、MATLABの行列は2次元以上です。もともとMATLABが持っていたのは2次元マトリクスでした。

転置について意味のある話をするには、少なくとも2つの次元が必要です。 1つはサイズ1を持ち、1dベクトルにマップできますが、それでも行列、2次元オブジェクトです。

したがって、reshapeまたは[:,None]で行われるかどうかにかかわらず、次元を1次元配列に追加することはハックではありません。これは、有効で正常なnumpy操作に最適です。

基本的な放送規則は次のとおり

  • サイズ1の寸法は、サイズ1の寸法は上に自動的に追加することができる

  • 他の配列の対応する寸法と一致するように変更することができます寸法の数に合わせて左(正面)に配置します。この例では

、両方のステップが適用されます。この(5)=>(1,5)=>(3,5)

In [458]: np.broadcast_to(np.arange(5), (3,5)) 
Out[458]: 
array([[0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4], 
     [0, 1, 2, 3, 4]]) 

を、我々は明示的にサイズを追加する必要があります右側(端)に一次元:

In [459]: np.broadcast_to(np.arange(5)[:,None], (5,3)) 
Out[459]: 
array([[0, 0, 0], 
     [1, 1, 1], 
     [2, 2, 2], 
     [3, 3, 3], 
     [4, 4, 4]]) 

np.broadcast_arrays(np.arange(5)[:,None], np.arange(3))は、2つ(5,3)のアレイを生成します。

np.broadcast_arrays(np.arange(5), np.arange(3)[:,None])は(3,5)を作る。

には、(5,3)または(3,5)などが必要かどうかを判断できないため、エラーが発生します。

+0

"右に自動的にサイズ1のディメンションを追加できます" - この例では_left_に追加されているようです。右側では、手動で追加する必要があります。 – SRobertJames

+0

訂正されました - 私は本当に失読症ではありません。私はちょうど多くの校正読書が必要です。 – hpaulj

0

ブロードキャストでは、新しいディメンションが左側に追加されるのは曖昧で、新しいディメンションを右側に追加するときにバグが発生しやすいためです。あなたは、軸を逆にすることによって、右にブロードキャストする機能を作り、放送、およびバック反転することができます

def broadcast_rightward(arr, shape): 
    return np.broadcast_to(arr.T, shape[::-1]).T 
関連する問題