2017-12-10 11 views
1

私は(28,28)の配列aを持っています。そして、私は(28,28,3)配列b s.tを取得したいと思います。 b[i][j][0] = b[i][j][1] = b[i][j][2] = a[i][j]このようにnumpy配列を操作するにはどうすればいいですか?

ループを退屈にすることなくこれを行うための簡単なショートカットはありますか?

+0

としてだけでサイドノート:配列は多次元インデックス作成をサポートします。 'b [i] [j] [0]'の代わりに 'b [i、j、0]'を使うことができます。 –

答えて

1
>>> import numpy as np 
>>> a = np.zeros((28,28)) 
>>> b = np.dstack((a,a,a)) 
>>> a.shape 
(28, 28) 
>>> b.shape 
(28, 28, 3) 

例:

>>> a = np.array([[1,2],[3,4]]) 
>>> b = np.dstack((a,a,a)) 
>>> a 
array([[1, 2], 
     [3, 4]]) 
>>> b 
array([[[1, 1, 1], 
     [2, 2, 2]], 

     [[3, 3, 3], 
     [4, 4, 4]]]) 
+0

'dstack'は要素をコピーしますが、' repeat'はそうではありません - この配列サイズではパフォーマンスの差は重要ではないかもしれませんが、大きな配列の場合は劇的なものになります。 –

+0

@BrandonDubeあなたのヒントをありがとう。 – Silencer

+0

@BrandonDube _whileは繰り返されません。それは私にとってのニュースです。そして 'np.shares_memory'へ:' np.shares_memory(b、b.repeat(1,1)) ' - ' False' –

0

あなたはbを割り当てて使用することができます放送:あなたが読み取り専用アクセスを必要であれば

b = np.empty(a.shape + (3,), a.dtype) 
b[...] = a[..., None] 

は、その後、非常に効率的な方法は、ストライドのビューを作成します

c = np.lib.stride_tricks.as_strided(a, a.shape + (3,), a.strides + (0,)) 

これはaとデータを共有します。つまり、cに書き込むと、aも変更されます。さらに、最後の軸に沿ってストライドはゼロであり、例えばc [1,1,0]とc [1,1,2]が同じメモリであり、一方が変化し、他方も変化することを意味する。それを望まないならコピーを作成します:

b = c.copy() 
+0

実際に*読み込み専用にするには、 'writable = False'が必要です。それがなければ、あなたはまだ*書き込みアクセス*を持っています。 – Divakar

+0

@Divakar私の言いたいことは、あなたが何をしているのか分からない限りは書きません。 Btw。私が先日私に見せた 'np.shares_memory'を使って、他の答えの下で議論を勝ち取ったのを見た? –

+0

優勝にお祝いですか? :)あなたは情報を共有するのが良いことを知っています。 – Divakar

1

あなたはaに軸を追加してからn=3回それを繰り返すことができます。

>>> a = np.random.randn(28, 28) 
>>> b = np.repeat(np.atleast_3d(a), repeats=3, axis=-1) 
>>> b.shape 
(28, 28, 3) 

と必要な、

>>> np.all(a == b[...,0]) 
True 
>>> np.all(b[...,0] == b[...,1]) 
True 
>>> np.all(b[...,1] == b[...,2]) 
True 
関連する問題