2013-05-24 51 views
6

Tôi có hai mảng 1D, một cho dữ liệu được đo và một cho vị trí. Ví dụ: dữ liệu được đo có thể là nhiệt độ và dãy kia có chiều cao của phép đo:Trung bình khoảng thời gian của dữ liệu 1D

temp = np.asarray([10, 9.6, 9.3, ..., -20.3, -21.0]) # Temperature in celsius 
height = np.asarray([129, 145, 167, ..., 5043, 5112]) # Height in meters 

Như bạn thấy, chiều cao của phép đo không được đặt cách nhau đều đặn.

Tôi muốn tính toán nhiệt độ trung bình theo khoảng cách đều nhau. Đây là một số loại di chuyển trung bình, nhưng kích thước cửa sổ là biến, bởi vì các điểm dữ liệu bên trong khoảng thời gian quan tâm không phải lúc nào cũng giống nhau.

Điều này có thể được thực hiện với một vòng lặp for theo cách sau:

regular_heights = np.arange(0, 6000, 100) # Regular heights every 100m 
regular_temps = [] 

for i in range(len(regular_heights)-1): 
    mask = np.logical_and(height > regular_heights[i], height < regular_heights[i+1]) 
    mean = np.mean(temp[mask]) 
    regular_temps.append(mean) 

regular_temps = np.hstack((regular_temps)) 

tôi không thích phương pháp này mà nhiều và tôi đã tự hỏi nếu có sẽ là một nhiều hơn "NumPy kiểu" giải pháp.

+0

Bạn có muốn có một "đường trung bình" hoặc "temp trung bình trong khoảng thời gian đều đặn cách nhau"? Tức là, nếu bạn có N khoảng thời gian, bạn muốn N trung bình, hoặc bạn có muốn một mức trung bình liên tục bằng cách sử dụng một cửa sổ di chuyển (kéo dài một phạm vi chiều cao tại mỗi địa điểm)? – tom10

+0

Như tôi nói trong commnet của tôi để trả lời của @elyase, tôi có thể cần phải di đầu tiên có nghĩa là trong khoảng cách đều đặn và sau đó mịn nó với một spline. Tuy nhiên, mức trung bình động cũng có thể kết hợp tốt với đường spline. –

Trả lời

3

Có thể bạn đang tìm kiếm UnivariateSpline. Ví dụ:

from scipy.interpolate import UnivariateSpline 

temp = np.asarray([10, 9.6, 9.3, 9.0, 8.7]) # Temperature in celsius 
height = np.asarray([129, 145, 167, 190, 213]) # Height in meters 
f = UnivariateSpline(height, temp) 

Bây giờ bạn có thể đánh giá f bất cứ nơi nào bạn muốn:

regular_heights = np.arange(120, 213, 5)  # Regular heights every 5m 
plot(height, temp, 'o', regular_heights, f(regular_heights), 'x') 

enter image description here

+1

'f (regular_heights)' cho giá trị nội suy tại các điểm đó. Không phải những gì OP hỏi - giá trị trung bình của các giá trị trong khoảng thời gian cao. – mg007

+0

Tôi biết ông đã đề cập đến 'có nghĩa' nhưng theo một cách khá mơ hồ (có nghĩa là gì?). Có vẻ như đây là những gì anh ấy thực sự muốn, đó là lý do tại sao tôi nói 'có lẽ đang tìm kiếm ...'. Nếu bạn muốn bạn có thể gửi một câu trả lời với trung bình, tôi đoán chúng tôi sẽ tìm ra cuối cùng những gì ông là sau. – elyase

+0

'UnivariateSpline' trông tốt cho dữ liệu được chụp trong một hồ sơ theo chiều dọc, tuy nhiên, trong trường hợp của tôi, dữ liệu được lấy đồng thời tại các vị trí khác nhau các giá trị rất khác nhau. Có lẽ giải pháp của tôi cần sự kết hợp của cả hai cách tiếp cận, đầu tiên là trung bình để có được một tập dữ liệu thường xuyên khoảng cách và áp dụng một spline để có được một đường cong trơn tru. –

Các vấn đề liên quan