2013-02-19 46 views
9

Hãy xem xét những mảng NumPy sau:Tìm giá trị nhỏ nhất trong một mảng NumPy và các giá trị tương ứng cho phần còn lại của hàng của mảng

a = np.array([[1,4], [2,1],(3,10),(4,8)]) 

này đưa ra một mảng trông giống như sau:

array([[ 1, 4], 
     [ 2, 1], 
     [ 3, 10], 
     [ 4, 8]]) 

Điều tôi đang cố gắng tìm giá trị tối thiểu của cột thứ hai (trong trường hợp này là 1), và sau đó báo cáo giá trị khác của cặp đó (trong trường hợp này là 2). Tôi đã thử sử dụng một cái gì đó như argmin, nhưng điều đó được vấp lên bởi 1 trong cột đầu tiên.

Có cách nào để thực hiện việc này dễ dàng không? Tôi cũng đã xem xét phân loại mảng, nhưng tôi dường như không thể làm được điều đó để làm việc theo cách giữ các cặp lại với nhau. Dữ liệu đang được tạo ra bởi một vòng lặp như sau, vì vậy nếu có một cách dễ dàng hơn để làm điều này mà không phải là một mảng NumPy, tôi coi đó là một câu trả lời quá:

results = np.zeros((100,2)) 

# Loop over search range, change kappa each time 
for i in range(100): 
    results[i,0] = function1(x) 
    results[i,1] = function2(y) 

Trả lời

20

Làm thế nào về

a[np.argmin(a[:, 1]), 0] 

lao xuống

a. Lấy cột thứ hai

>>> a[:, 1] 
array([ 4, 1, 10, 8]) 

b. Lấy chỉ mục của phần tử tối thiểu trong cột thứ hai

>>> np.argmin(a[:, 1]) 
1 

c. Chỉ số a với điều đó để nhận hàng tương ứng

>>> a[np.argmin(a[:, 1])] 
array([2, 1]) 

d. Và lấy phần tử đầu tiên

>>> a[np.argmin(a[:, 1]), 0] 
2 
+3

Mặc dù vì lợi ích của sự tỉnh táo của mình, bạn có thể giải thích sự logic của những gì chính xác điều này cho tôi? Cố gắng tránh mã hóa hàng hóa. – Fomite

+0

Xong - hy vọng có ý nghĩa – YXD

5

Sử dụng np.argmin có lẽ là cách tốt nhất để giải quyết vấn đề này. Để làm điều đó trong trăn tinh khiết, bạn có thể sử dụng:

min(tuple(r[::-1]) for r in a)[::-1]

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