2013-09-26 2 views
5

私は[[6,7,8],[1,2,3],[1,2,3]]のような3D numpyの配列を持っていると私は、他のすべての「バンド」のための最初の「バンド」[6,7,8]として架空の値を使用するために架空の値として3D numpyの配列の最初のバンドを使用します。それはそのように見えるはずですはどのようにすべての他のバンド

[[6,7,8],[1+6j,2+7j,3+,8j],[1+6j,2+7j,3+8j]] 

誰でもその仕組みが分かりますか? 助けてくれてありがとう!

答えて

4

通常、人の句は最初の行として "最初のバンド"です。

>>> arr = np.array([[6,7,8],[1,2,3],[1,2,3]]) 

#First need a complex datatype. 
>>> arr = arr.astype(np.complex) 
>>> arr 
array([[ 6.+0.j, 7.+0.j, 8.+0.j], 
     [ 1.+0.j, 2.+0.j, 3.+0.j], 
     [ 1.+0.j, 2.+0.j, 3.+0.j]]) 

# .imag and .real access the real and imaginary parts of the array. 
>>> arr[1:].imag = arr[0].real 
>>> arr 
array([[ 6.+0.j, 7.+0.j, 8.+0.j], 
     [ 1.+6.j, 2.+7.j, 3.+8.j], 
     [ 1.+6.j, 2.+7.j, 3.+8.j]]) 

複数の鋳造の呼び出しをスキップし、vstackはかなりの時間節約することができます:より大きなアレイの場合

arr = np.array([[6,7,8],[1,2,3],[1,2,3]]) 

%timeit a=arr.astype(np.complex);a[1:].imag = a[0].real 
100000 loops, best of 3: 4.03 µs per loop 

%timeit np.vstack((arr[0,:], arr[1:,:] + arr[0,:] * 1.j)) 
10000 loops, best of 3: 25.2 µs per loop 

arr = np.random.rand(500,500) 

%timeit a=arr.astype(np.complex);a[1:].imag = a[0].real 
1000 loops, best of 3: 898 µs per loop 

In [13]: %timeit np.vstack((arr[0,:], arr[1:,:] + arr[0,:] * 1.j)) 
1000 loops, best of 3: 1.77 ms per loop 

違いを主に持つvstackオプションから来ています複雑なデータ型に2回キャストします。

%timeit arr.astype(np.complex) 
1000 loops, best of 3: 530 µs per loop 
3

1つのコンパクトな解決策。

>>> a = np.array([[6,7,8],[1,2,3],[1,2,3]]) 
>>> np.vstack((a[0,:], a[1:,:] + a[0,:] * 1.j)) 
array([[ 6.+0.j, 7.+0.j, 8.+0.j], 
     [ 1.+6.j, 2.+7.j, 3.+8.j], 
     [ 1.+6.j, 2.+7.j, 3.+8.j]]) 

最初の行は、(ゼロと虚数部を有する)複素数値を含んでいるので、新しい配列が複雑であることを考慮してください配列内のすべての要素が同じ型でなければならないためです。

+0

これは単純化することができます: 'np.vstack((a [0]、a [1:] + a [0] * 1.j))'。 – Daniel

+0

良い点ですが、通常、すべての寸法を表示する必要はありません。 – jabaldonedo

関連する問題