2013-10-09 14 views
7

Tôi có một mảng có chiều rộng 4 chiều (x, y, z, thời gian) và muốn thực hiện một số numpy.polyfit thông qua thứ nguyên thời gian, tại mỗi toạ độ x, y, z . Ví dụ:Hồi quy dọc theo một chiều trong một mảng có nhiều mảng

import numpy as np 
n = 10  # size of my x,y,z dimensions 
degree = 2 # degree of my polyfit 
time_len = 5 # number of time samples 

# Make some data 
A = np.random.rand(n*n*n*time_len).reshape(n,n,n,time_len) 

# An x vector to regress through evenly spaced samples 
X = np.arange(time_len) 

# A placeholder for the regressions 
regressions = np.zeros(n*n*n*(degree+1)).reshape(n,n,n,degree+1) 

# Loop over each index in the array (slow!) 
for row in range(A.shape[0]) : 
    for col in range(A.shape[1]) : 
     for slice in range(A.shape[2]): 
      fit = np.polyfit(X, A[row,col,slice,:], degree) 
      regressions[row,col,slice] = fit 

Tôi muốn truy cập mảng regressions mà không phải trải qua tất cả các vòng lặp. Điều này có thể không?

+1

[Câu trả lời] (http://stackoverflow.com/a/16315330/832621) đưa ra ví dụ về một vấn đề tương tự như của bạn ... –

+2

@SaulloCastro chắc chắn - nhưng câu trả lời đó vẫn không mua bất kỳ lợi thế hiệu suất nào trên một vòng lặp Python bình thường, dễ đọc hơn IMO –

Trả lời

9

Định hình lại dữ liệu của bạn sao cho mỗi phần riêng lẻ nằm trên cột của mảng 2d. Sau đó chạy polyfit một lần.

A2 = A.reshape(time_len, -1) 
regressions = np.polyfit(X, A2, degree) 
regressions = regressions.reshape(A.shape) 

Hoặc điều gì đó tương tự ... Tôi không thực sự hiểu tất cả các thứ nguyên tương ứng trong tập dữ liệu của bạn, vì vậy tôi không chắc bạn muốn hình dạng nào. Nhưng vấn đề là, mỗi tập dữ liệu riêng lẻ cho polyfit phải chiếm một cột trong ma trận A2.

Nhân tiện, nếu bạn quan tâm đến hiệu suất, thì bạn nên cấu hình mã của mình bằng mô-đun hồ sơ hoặc thông tin tương tự. Nói chung, bạn không thể luôn dự đoán mã sẽ chạy nhanh như thế nào chỉ bằng cách đánh bóng nó. Bạn phải chạy nó. Mặc dù trong trường hợp này, việc xóa các vòng lặp cũng sẽ làm cho mã của bạn dễ đọc hơn 100 lần, điều này thậm chí còn quan trọng hơn.

+2

+1 đây là giải pháp tốt hơn nhiều so với việc sử dụng 'apply_along_axis',' vectorize' hoặc 'apply_over_axes', vì nó thực sự vector hóa hoạt động ở mức mã C –

+2

làm việc nhiều. Hóa ra mặc dù tôi cần 'A2 = A.T.reshape (time_len, -1)' và 'regressions = regressions.T.reshape ((n, n, n, độ + 1))' – ajwood

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