2017-12-13 16 views
1

私はいくつかの高速フーリエ変換(技術的に離散フーリエ変換)の係数の分類にいくつかのsklearn推定を使用しようとしています。私はnpy.fft.fft(X)の出力としてnumpyの配列X_cを取得し、元のX_cの各(複雑な)列が2つ(実数/浮動小数点数)の列に変換された実数の配列X_rに変換したいすなわち、形状は(r、c)から(r、2c)になる。だから私は.view(np.float64)を使う。それは最初に機能します。サブセットが影響を受けます。ビュー(np.float64)の動作

問題は、最初にX_c2 = X_c [:, range(3)]で元の複合配列のいくつかの係数だけを保持してから、以前と同じことを列数2倍のランク数を得ました(各要素の虚数部分は元の下に新しい行に入れられます)。

なぜこれが起こるのか、私は本当に分かりません。自分自身をより明確にするために

は、ここでおもちゃの例である:

import numpy as np 

# I create a complex array 
X_c = np.arange(8, dtype = np.complex128).reshape(2, 4) 
print(X_c.shape) # -> (2, 4) 

# I use .view to transform it into something real and it works 
# the way I want it. 
X_r = X_c.view(np.float64) 
print(X_r.shape) # -> (2, 8) 

# Now I subset the array. 
indices_coef = range(3) 
X_c2 = X_c[:, indices_coef] 
print(X_c2.shape) # -> (2, 3) 
X_r2 = X_c2.view(np.float64) 

# In the next line I obtain (4, 3), when I was expecting (2, 6)... 
print(X_r2.shape) # -> (4, 3) 

誰もがこの動作の違いの理由を参照してくださいしていますか?

答えて

0

は、私は警告を取得:

In [5]: X_c2 = X_c[:,range(3)] 
In [6]: X_c2 
Out[6]: 
array([[ 0.+0.j, 1.+0.j, 2.+0.j], 
     [ 4.+0.j, 5.+0.j, 6.+0.j]]) 
In [7]: X_c2.view(np.float64) 
/usr/local/bin/ipython3:1: DeprecationWarning: Changing the shape of non-C contiguous array by 
descriptor assignment is deprecated. To maintain 
the Fortran contiguity of a multidimensional Fortran 
array, use 'a.T.view(...).T' instead 
    #!/usr/bin/python3 
Out[7]: 
array([[ 0., 1., 2.], 
     [ 0., 0., 0.], 
     [ 4., 5., 6.], 
     [ 0., 0., 0.]]) 


In [12]: X_c2.strides 
Out[12]: (16, 32) 
In [13]: X_c2.flags 
Out[13]: 
    C_CONTIGUOUS : False 
    F_CONTIGUOUS : True 

だから、このコピーを(またはビューである?)Fortranのためです。推奨されるX_c2.T.view(float).Tは、警告なしで同じ4x3アレイを生成します。

最初のビューが示すように、複雑な配列は浮動小数点数の2倍のデータレイアウトを持ちます。

構造化配列viewを試してみると面白い形の動作を見たことがあります。私はcomplex dtypeがdtype('f8,f8')配列のように振舞っているのだろうかと思います。


私はそれがコピーであるあなたのX_c2を変更した場合、私は安心の予想行動

In [19]: X_c3 = X_c[:,range(3)].copy() 
In [20]: X_c3.flags 
Out[20]: 
    C_CONTIGUOUS : True 
    F_CONTIGUOUS : False 
    OWNDATA : True 
    WRITEABLE : True 
    ALIGNED : True 
    UPDATEIFCOPY : False 
In [21]: X_c3.strides 
Out[21]: (48, 16) 
In [22]: X_c3.view(float) 
Out[22]: 
array([[ 0., 0., 1., 0., 2., 0.], 
     [ 4., 0., 5., 0., 6., 0.]]) 

を取得します。しかし、私は[:, range(3)]索引作成がFオーダー・ビューを作成する理由について困惑しています。それは事前のインデックス作成でなければなりません。

そして実際、真のスライスは、このビューは

In [28]: X_c[:,:3].view(np.float64) 
--------------------------------------------------------------------------- 
ValueError: new type not compatible with array. 

だから、範囲のインデックスは、ハイブリッドオブジェクトのいくつかの並べ替えを作成していることはできません。

+0

高度なインデックス作成ドキュメントのように見えます:[高度なインデックス作成結果のメモリレイアウトは、インデックス作成操作ごとに最適化され、特定のメモリ順序は想定されません。](https://docs.scipy.org/doc – user2357112

+0

結果の特定のメモリ順序を保証したい場合、 'numpy.asarray(result、order = 'C')'はジョブ。 'numpy.array(result、order = 'C'、copy = 'False')'も動作します。わずかにより洗練されていますが、ドキュメントと少しは一貫しています。 – user2357112

+0

'numpy.ascontiguousarray(result)'もあります。これはC連続配列を保証します(Fortranは連続していません)。 – user2357112

関連する問題