私は(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配列を操作するにはどうすればいいですか?
ループを退屈にすることなくこれを行うための簡単なショートカットはありますか?
私は(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配列を操作するにはどうすればいいですか?
ループを退屈にすることなくこれを行うための簡単なショートカットはありますか?
>>> 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]]])
'dstack'は要素をコピーしますが、' repeat'はそうではありません - この配列サイズではパフォーマンスの差は重要ではないかもしれませんが、大きな配列の場合は劇的なものになります。 –
@BrandonDubeあなたのヒントをありがとう。 – Silencer
@BrandonDube _whileは繰り返されません。それは私にとってのニュースです。そして 'np.shares_memory'へ:' np.shares_memory(b、b.repeat(1,1)) ' - ' False' –
あなたは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()
あなたは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
としてだけでサイドノート:配列は多次元インデックス作成をサポートします。 'b [i] [j] [0]'の代わりに 'b [i、j、0]'を使うことができます。 –