2017-12-13 7 views
1

일부 고속 푸리에 변환 (기술적으로 Discrete Fourier Transform)의 계수에 대한 분류에 일부 Sklearn 추정량을 사용하려고합니다. 나는 nump 배열 X_c를 np.fft.fft (X)의 출력으로 얻었고 원래의 X_c의 각 (복합) 열이 두 개의 (실수/부동 소수점) 열로 변환 된 실제 열등 배열 X_r로 변환하려고합니다. X_r, 즉 모양이 (r, c)에서 (r, 2c)로 이동합니다. 그래서 .view (np.float64)를 사용합니다. 그것은 처음에는 작동합니다.하위 집합이 .view (np.float64) 동작에 영향을 미침

문제는 처음에 X_c2 = X_c [:, range (3)]를 사용하여 원본 복합 배열의 일부 계수 만 유지 한 다음 이전과 동일한 작업을 수행하는 대신 열 수 두 배로 늘리면 순위의 수를 두 배로 늘릴 수 있습니다 (각 요소의 허수 부는 원본 아래에 새로운 행에 넣어집니다).

나는 왜 이런 일이 발생하는지 정말로 이해하지 못합니다.

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 

그래서이 복사본을 (또는 도면이다?) 포트란 순서입니다. X_c2.T.view(float).T은 경고없이 동일한 4x3 어레이를 생성합니다.

첫 번째보기에서 복잡한 배열은 float 수의 두 배와 동일한 데이터 레이아웃을가집니다.

구조화 된 배열 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 /numpy-1.13.0/reference/arrays.indexing.html#detailed-notes) – user2357112

+0

결과에 대한 특정 메모리 순서를 보장하려면'numpy.asarray (result, order = 'C')'가 일. 'numpy.array (result, order = 'C', copy = 'False')'도 작동합니다; 약간 더 근사하지만 약간 더 문서와 일치합니다. – user2357112

+0

'numpy.ascontiguousarray (result)'도 있는데, 이는 C 연속 배열을 보장합니다 (연속하지 않는 Fortran). – user2357112

관련 문제