np.diag_indices
で簡単にコーディングすることができます。私は、ストライドされたソリューション(可能であれば)に比べて効率についてはありません。私は
まずインデックス
In [2]: np.diag_indices(2)
Out[2]: (array([0, 1]), array([0, 1]))
よりシンプルなスタートに十分な私の開発の歴史を簡略化することができるかどうかを見てみましょう。最初は2次元を必要とせず、形状を変更することができます。私たちは、おそらく終わるの寸法を必要としませんが、私は今のためにそれを残しておきます:
In [4]: A2=np.zeros((4,2,2,3),int)
In [5]: A2[:,0,0,:]=A1
In [6]: A2[:,1,1,:]=A1
In [7]: A2
Out[7]:
array([[[[ 0, 1, 2],
[ 0, 0, 0]],
[[ 0, 0, 0],
[[[ 3, 4, 5],
[ 0, 0, 0]],
[[ 0, 0, 0],
[ 3, 4, 5]]],
...
[[[ 9, 10, 11],
[ 0, 0, 0]],
[ 0, 1, 2]]],
...
[[ 0, 0, 0],
[ 9, 10, 11]]]])
オルタナティブ:
In [8]: A3=np.zeros((4,2,2,3),int)
In [9]: i,j=np.diag_indices(2)
In [10]: A3[:,i,j,:]=A1
...
ValueError: shape mismatch: value array of shape (4,3) could not be broadcast to indexing result of shape (2,4,3)
形状の不一致
In [3]: A1=np.arange(12).reshape(4,3)
今リファレンス・ソリューションを構築します最初の試み
In [12]: A2[:,i,j,:]
Out[12]:
array([[[ 0, 1, 2],
[ 0, 1, 2]],
[[ 3, 4, 5],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 6, 7, 8]],
[[ 9, 10, 11],
[ 9, 10, 11]]])
In [13]: A2[:,i,j,:].shape
Out[13]: (4, 2, 3)
A1
を変更して宛先スロットにブロードキャストできるようにする必要があります。
In [14]: A1.shape
Out[14]: (4, 3)
In [15]: A3[:,i,j,:] = A1[:,None,:]
In [16]: np.allclose(A2,A3)
Out[16]: True
A2[...,i,j,:] = A1[...,None,:]
はあなたの例を処理する必要があります。
アンも簡単なバージョンは、3dに消費する、1Dアレイで始まり
In [21]: a1=np.arange(3)
In [22]: a3=np.zeros((2,2,3),int)
In [23]: a3[...,i,j,:]=a1[...,None,:]
In [24]: a3[i,j,:]=a1 # equivalent since a1[None,:] is automatic
In [25]: a3
Out[25]:
array([[[0, 1, 2],
[0, 0, 0]],
[[0, 0, 0],
[0, 1, 2]]])
a3
a1
値の繰り返しパターンを有していません。それとも?
In [36]: a3.flatten()
Out[36]: array([0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 1, 2])
あなたが発見したとして、それはas_strides
ですべてのスロットを埋めるのは簡単だが、ハードだけで対角線を埋めるために:
In [46]: ast(a1,shape=a3.shape, strides=(0,0,4))
Out[46]:
array([[[0, 1, 2],
[0, 1, 2]],
[[0, 1, 2],
[0, 1, 2]]])
は 'A2.shape [2]、A2.shape [3う] 'be'(2,2) '実際のケースでも?もしそうであれば、そのような小さい次元では、コードは読みやすさとパフォーマンスの面では大丈夫です。 – Divakar
これは、 '(2,2)、'(3,3) 'とすることができますが、'(m、n、o、 'または'(3,3,3,3) 'となります。しかし、私はかなりの頻度で「A2」を構成しなければなりません。私はストライドで、私はA1だけを更新し、すぐにA2の変化を見ることができると期待した。 – mrkwjc
「A1」を連続して構築し、「A2」に「A1」の表示をさせようとするのではなく、「A1」を「A2」の表示にすることはできますか? – user2357112