2014-07-07 13 views
6

Tôi cảnh báo trước: Tôi có thể hoàn toàn bị nhầm lẫn vào lúc này. Tôi kể một câu chuyện ngắn về những gì tôi thực sự cố gắng đạt được vì điều đó có thể làm rõ mọi thứ. Giả sử tôi có f(a,b,c,d,e) và tôi muốn tìm arg max (d,e) f(a,b,c,d,e). Hãy xem xét một (ví dụ nhỏ của a) rời rạc hóa lưới F của f:Đánh giá mảng tại subarray cụ thể

F = np.tile(np.arange(0,10,0.1)[newaxis,newaxis,:,newaxis,newaxis], [10, 10, 1, 10, 10]) 
maxE = F.max(axis=-1) 
argmaxD = maxE.argmax(axis=-1) 
maxD = F.max(axis=-2) 
argmaxE = maxD.argmax(axis=-1) 

Đây là trường hợp như thế nào tôi thường giải quyết các phiên bản rời rạc. Nhưng bây giờ giả sử thay vào đó, rằng tôi muốn giải quyết arg max d f(a,b,c,d,e=X): Thay vì được chọn một cách tối ưu e cho mọi đầu vào khác, e là một cố định và được đưa ra (có kích thước AxBxCxD, trong ví dụ này sẽ là 10x10x100x10). Tôi gặp khó khăn trong việc giải quyết vấn đề này.

cách tiếp cận ngây thơ của tôi là

X = np.tile(np.arange(0,10)[newaxis,newaxis,:,newaxis], [10,10,1,10]) 
maxX = F[X] 
argmaxD = maxX.argmax(axis=-1) 

Tuy nhiên, sự gia tăng rất lớn của bộ nhớ mà treo IDE của tôi ngụ ý rằng F[X] là rõ ràng không phải là điều tôi đang tìm kiếm.

Hiệu suất là chìa khóa.

+0

có vẻ như những gì bạn muốn là một cái gì đó như: 'np.argmax (np.max (F, trục = -1), trục = -1)' –

Trả lời

2

Tôi tin rằng bạn có thể làm điều đó như thế này, nhưng có lẽ có một cách tốt hơn ..

n = 10 
F = np.tile(np.arange(0,n,0.1)[None,None,:,None,None], [n, n, 1, n, n]) 
X = np.tile(np.arange(0,n)[None,None,:,None], [n, n, 1, n]) 

a,b,c,d = np.ogrid[:n,:n,:n,:n] 
argmaxD = F[a,b,c,d,X].argmax(axis=-1) 

Trên X không chiếm toàn bộ không gian, như chúng ta đã thảo luận trong các ý kiến. Nếu bạn muốn chọn e cho tất cả a, b, cd bạn có thể làm ví dụ .:

X = np.tile(np.arange(0,n,0.1).astype(int)[None,None,:,None], [n, n, 1, n]) 
a,b,c,d = np.ogrid[:n,:n,:100,:n] 
argmaxD = F[a,b,c,d,X].argmax(axis=-1) 

Ngoài ra, thông báo rằng thay vì tile bạn có thể tận dụng truyền thông. Nhưng sau đó F[a,b,c,d,X] có một chiều hướng ít vì vậy bạn nên cung cấp một cái gì đó giống như axis=3:

X = np.arange(0,n,0.1).astype(int)[None,None,:,None] 
a,b,c,d = np.ogrid[:n,:n,:100,:n] 
argmaxD = F[a,b,c,d,X].argmax(axis=3) 
+0

Nếu không tiêu hóa hoàn toàn những gì đang xảy ra ở đây: my cũ 'argmaxD '(từ tối đa hóa tiêu chuẩn) có hình dạng' (10L, 10L, 100L) ', trong khi' argmaxD' bạn cung cấp có hình dạng '(10L, 10L, 10L)'. Vì nó được cho là maximizer tối ưu cho '(a, b, c)', có hình dạng '(10, 10, 100)', điều này không thể đúng. – FooBar

+0

@ FooBar, tôi đã nhận thấy kích thước khác nhau ở một trong các kích thước, nhưng đó là kết quả của việc chọn 'X = np.tile (np.arange (0, n), ...' .Tôi đoán bạn nên nhập Sau đó bạn cũng nên sử dụng 'np.ogrid [: n,: n,: 100,: n]' –

+0

'0.1' stepize cho' IndexError', vì nó cần phải là số nguyên. để chứa các giá trị số nguyên cho những gì chúng tôi đã chọn trong lưới cho 'e'.' e' chứa các phần tử '100'. Điều đó có nghĩa, chúng ta cần phải chọn giữa' (0, 99) 'cho' e', phải không? Tôi đã thử 'X = np.tile (np.arange (0,100) ...)', nhưng tôi nhận được một 'IndexError' ... Tôi biết tôi đang phạm sai lầm, tôi không thể chỉ phát hiện ra nó. – FooBar

0

Đây sẽ là ý tưởng của tôi để giải quyết này.

from itertools import product, starmap 

f = lambda a,b,c,d,e : d/e 

args_iterable = product([1],[2],[3],range(1,1000),range(1,1000)) 

max_val, max_args = max(starmap(lambda *args: (f(*args), args) , args_iterable)) 

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