次のように定義された 3D 複雑な numpy 配列があります。
> import numpy as np
> a = np.random.rand(2,3,4) + np.random.rand(2,3,4) * 1j
> a
array([[[ 0.40506245+0.68587874j, 0.74700976+0.73208816j,
0.42010818+0.31124884j, 0.27181199+0.54599156j],
[ 0.29457621+0.34057513j, 0.82490182+0.63943948j,
0.46887722+0.12734375j, 0.77184637+0.21522095j],
[ 0.67774944+0.8208908j , 0.41476702+0.85332392j,
0.10084665+0.56146324j, 0.71325041+0.77306548j]],
[[ 0.77843387+0.23660274j, 0.23671262+0.63997834j,
0.60831419+0.41741288j, 0.53870756+0.13747055j],
[ 0.12477767+0.54603678j, 0.60537090+0.89208227j,
0.16027151+0.17575777j, 0.18801875+0.27282324j],
[ 0.82308271+0.97238411j, 0.47458327+0.75200695j,
0.16085009+0.60620705j, 0.79766571+0.76470634j]]])
少しMATLABに似た特定の形式の文字列に出力する必要があり s
、私が見つけた最良の方法は次のとおりです:(私にとって、形式を説明する最良の方法はこのコードを使用することです)
> s = ''
> for k in range(a.shape[2]):
> for j in range(a.shape[1]):
> for i in range(a.shape[0]):
> s += str(a[i,j,k].real) + ' '
> for j in range(a.shape[1]):
> for i in range(a.shape[0]):
> s += str(a[i,j,k].imag) + ' '
私にはあまり「pythonic」に見えないこのコードに満足していません (私は C++ 出身で、Python についてあまり知りません)。Python には、ここで使用できる優れた構文 (たとえば、リストの内包表記など) が用意されていると確信していますが、あまり詳しくありません。
したがって、私の質問は次のとおりです。このコードをよりpythonicに改善するにはどうすればよいですか?
編集:この 3D 配列は、2 行 3 列の複素行列の配列として表示されます。この形式は、最初の行列の実部、次に虚部を出力し、各行列に対してそのように反復することで構成されます。
これは、MATLAB でこのコードを実行したときに得られる形式です。
> a = rand(2,3,4) + rand(2,3,4) * 1i;
> s = sprintf('%g %g ', [real(a) imag(a)]);
私の主な目標は、このフォーマットと互換性を持つことです。