2011-10-21 33 views
5

Tôi có một mảng có khối lượng 3D (thời gian, X, Y) chứa 6 chuỗi thời gian hàng giờ trong một vài năm. (nói 5). Tôi muốn tạo một chuỗi thời gian lấy mẫu có chứa 1 ví dụ của mỗi ngày dương lịch được lấy ngẫu nhiên từ các bản ghi có sẵn (5 khả năng mỗi ngày), như sau.Cách nhanh nhất để lấy mẫu lát các mảng khối ô vuông là gì?

  • 01 Tháng Một: 2006
  • 2 tháng 1: 2011
  • 03 Tháng 1: 2009
  • ...

này có nghĩa là tôi cần phải thực hiện 4 giá trị từ 01/01/2006 , 4 giá trị từ 02/01/2011, v.v. Tôi có phiên bản hoạt động, hoạt động như sau:

  • Định hình lại mảng đầu vào để thêm thứ nguyên "năm" (Thời gian, Năm, X, Y)
  • Tạo mảng giá trị 365 của số nguyên được tạo ngẫu nhiên giữa 0 và 4
  • Sử dụng np.repeat và mảng số nguyên để trích xuất chỉ các giá trị liên quan:

Ví dụ:

sampledValues = Variable[np.arange(numberOfDays * ValuesPerDays), sampledYears.repeat(ValuesPerDays),:,:] 

Điều này dường như làm việc, nhưng tôi đã tự hỏi nếu điều này là cách tiếp cận tốt nhất/nhanh nhất để giải quyết vấn đề của tôi? Tốc độ là quan trọng vì tôi đang làm điều này trong một vòng lặp, adn sẽ được hưởng lợi từ việc kiểm tra càng nhiều trường hợp càng tốt.

Tôi có làm đúng không?

Cảm ơn

EDIT tôi quên đề cập đến mà tôi lọc các dữ liệu đầu vào để loại bỏ các ngày 29 tháng hai năm nhuận. Về cơ bản mục tiêu của hoạt động đó là tìm mẫu 365 ngày phù hợp với chuỗi thời gian dài về mặt trung bình, vv Nếu chuỗi thời gian lấy mẫu vượt qua kiểm tra chất lượng của tôi, tôi muốn xuất nó và bắt đầu lại.

Trả lời

3

Năm 2008 dài 366 ngày, vì vậy đừng định hình lại.

Có một cái nhìn tại scikits.timeseries:

import scikits.timeseries as ts 

start_date = ts.Date('H', '2006-01-01 00:00') 
end_date = ts.Date('H', '2010-12-31 18:00') 
arr3d = ... # your 3D array [time, X, Y] 

dates = ts.date_array(start_date=start_date, end_date=end_date, freq='H')[::6] 
t = ts.time_series(arr3d, dates=dates) 
# just make sure arr3d.shape[0] == len(dates) ! 

Bây giờ bạn có thể truy cập vào t dữ liệu với ngày/tháng/đối tượng năm:

t[np.logical_and(t.day == 1, t.month == 1)] 

để ví dụ:

for day_of_year in xrange(1, 366): 
    year = np.random.randint(2006, 2011) 

    t[np.logical_and(t.day_of_year == day_of_year, t.year == year)] 
    # returns a [4, X, Y] array with data from that day 

Chơi với các thuộc tính của t để làm cho nó làm việc với năm nhuận quá.

+0

Điều này giống như một cách tiếp cận đầy hứa hẹn! – heltonbiker

+0

Tôi đã đề cập đến nó nhưng tôi không thực sự quan tâm đến những năm nhuận trong trường hợp này, vì tôi đã loại bỏ tất cả các lần xuất hiện 29 tháng 2 trong chuỗi thời gian đầu vào. Tôi mặc dù sử dụng scikits.timeseries, tuy nhiên tôi không chắc chắn tôi sẽ thực sự được hưởng lợi từ nó về tốc độ. Ngoài ra tôi có thể muốn bắt đầu ngày của tôi lúc 6:00 hoặc 12:00, vì vậy tôi không thực sự muốn tạo ra một mảng các đối tượng datetime để trích xuất mỗi khi tôi chỉ có thể sử dụng mảng lấy mẫu của mình (rs = np .random.randint (0, np.size (năm), size = 365)) ngay lập tức. Nhưng tôi có thể sai! – Jahfet

0

Tôi không thấy cần phải định hình lại mảng, vì bạn có thể nhúng thông tin kích thước năm vào quy trình lấy mẫu của mình và để lại mảng với hình dạng ban đầu của nó.

Ví dụ: bạn có thể tạo khoảng trống ngẫu nhiên (từ 0 đến 365) và chọn lát có chỉ mục, ví dụ: n*365 + offset.

Dù sao, tôi không nghĩ câu hỏi của bạn đã hoàn thành, bởi vì tôi không hoàn toàn hiểu những gì bạn cần làm hoặc tại sao.

+0

Tôi không biết liệu hoạt động định hình lại là cần thiết hay không, tôi chỉ nghĩ rằng nó sẽ thuận tiện cho tôi khi tôi về cơ bản có thể chọn năm nào tôi muốn trích xuất mỗi ngày rất dễ dàng. Tôi chỉ phải làm điều đó một lần trước khi vào vòng lặp lấy mẫu của tôi vì vậy tôi mặc dù điều đó sẽ không có tác động đến hiệu suất. Tôi đã thêm một vài chi tiết cho câu hỏi, hy vọng bạn sẽ hiểu rõ hơn những gì tôi đang làm. – Jahfet

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