2013-04-10 23 views
20

Trong Python NumPy, có một chức năng unwrap rằng:Đối diện của numpy.unwrap

Unwrap giai đoạn radian p bằng cách thay đổi tuyệt đối nhảy lớn hơn tạm ngừng đến 2 * pi bổ sung của họ dọc theo trục nhất định.

Bây giờ, tôi muốn thực hiện chức năng ngược lại. Làm cách nào để tôi có thể quấn một loạt các giai đoạn? Ví dụ. làm thế nào để chuyển đổi tất cả các góc để hạn chế chúng giữa-π và π?

Cách hiển nhiên sẽ là để làm một cái gì đó như:

for i, a in enumerate(phases): 
    while a < pi: 
     a += 2 * pi 
    while a > pi: 
     a -= 2 * pi 
    phases[i] = a 

nhưng là có một/cách nhanh hơn đơn giản hơn?

Trả lời

27
phases = (phases + np.pi) % (2 * np.pi) - np.pi 
+2

Tôi không nhận ra rằng tôi có thể sử dụng toán tử% với các giá trị dấu phẩy động. Nhưng tại sao bạn lại thêm π trước khi thực hiện mô đun? –

+1

vì điều đó là cần thiết nếu bạn cần kết quả nằm giữa (-np.pi, np.pi) thay vì (0,2 * np.pi). Nếu bạn không thêm nó, nhưng chỉ trừ đi, 0 sẽ được ánh xạ vào -> -np.pi mà không chính xác –

+0

Điều đó hiển nhiên! Bây giờ tôi cảm thấy ngu ngốc ...Tôi đã không nhận ra nó bởi vì tôi chỉ quan tâm đến giai đoạn tương đối, và không chú ý đến giai đoạn tuyệt đối. –

8
import numpy as np 
phases = np.arctan2(np.sin(phases), np.cos(phases)) 

này hoạt động vì sin (giai đoạn)/cos (giai đoạn) == tan (giai đoạn). Chúng ta lấy lại các pha (modulo 2π) bằng cách sử dụng hàm nghịch đảo. Về mặt toán học, hàm tiếp tuyến nghịch đảo là đa giá trị, do đó, trong các ngôn ngữ lập trình, nó thường được định nghĩa để trả về pha trong một khoảng thời gian cố định.

Hàm arctangent hai tham số, tức là np.arctan2(numerator, denominator), giống như hàm arctangent thông thường, ngoại trừ việc nó theo dõi các dấu hiệu của tử số và mẫu số, và do đó có thể trả về pha modulo 2π, thay vì thường xuyên np.arctan(numerator/denominator) chức năng mà chỉ có thể trở lại giai đoạn modulo π. Việc thực hiện chức năng arctan2 của Numpy được định nghĩa để trả về pha trong phạm vi [-π, + π], là phạm vi mà OP yêu cầu.

Giải thích thêm: Phương pháp arctan2 này sau trực tiếp từ các đại diện phức tạp, và là hoàn toàn về mặt toán học tương đương với:

phases = np.angle(np.exp(1j*phases)) 

có thể được trực quan hơn. Và trên thực tế, chức năng angle của numpy sử dụng arctan2 đằng sau hậu trường để tách các thành phần ảo và thực của hàm mũ, tức là sin và cosin.

+1

Vui lòng giải thích câu trả lời của bạn. OP có nhiều khả năng hiểu câu trả lời của bạn với một vài câu. – Ratbert

+0

Interresting, nhưng có lẽ rất không hiệu quả ... Nhưng tôi cho bạn upvote cho câu trả lời cũng bằng văn bản. –

+2

Tôi đồng ý rằng điều này là chậm hơn so với sử dụng toán tử '%', nhưng nó trực quan hơn đối với tôi (nhưng có lẽ tôi là người duy nhất) vì nó đơn giản sau biểu diễn số phức, xem sửa. Hơn nữa, tôi không phải suy nghĩ kỹ về việc toán tử '%' của python có giữ dấu hiệu của số chia hay cổ tức hay không và điều này ảnh hưởng đến kết quả như thế nào, hoặc tôi phải cộng và trừ một hằng số trước và sau khi thực hiện mod hoạt động để giữ cho pha kết quả trong phạm vi tôi muốn. – u55

3

Câu trả lời này là sự thay đổi nhỏ để sega_sai câu trả lời đó là:

phases = (phases + np.pi) % (2 * np.pi) - np.pi 

này bản đồ giai đoạn tới [-pi, pi) -> có nghĩa là pi được ánh xạ tới -pi

Trên đây:

In [27]: phases = np.pi 

In [28]: phases = (phases + np.pi) % (2 * np.pi) - np.pi 

In [29]: print phases 
-3.14159265359 

đó là hoàn toàn hợp pháp nhưng nếu bạn muốn có một bản đồ của (-pi, pi] sau đó

Lần đầu vào và đầu ra của hoạt động mua -1. Giống như vậy:

phases = ((-phases + np.pi) % (2.0 * np.pi) - np.pi) * -1.0 
Các vấn đề liên quan