2012-09-06 40 views
16

Tôi có một mảng mờ với hình dạng (30,480,640), trục thứ 1 và thứ 2 đại diện cho vị trí (vĩ độ và kinh độ), trục thứ 0 chứa các điểm dữ liệu thực tế. Tôi muốn sử dụng giá trị thường xuyên nhất dọc theo trục 0 ở mỗi vị trí , để xây dựng một mảng mới có hình dạng (1.480.640) .ie:Làm thế nào để tìm các giá trị thường xuyên nhất trong ndarray numpy?

>>> data 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]], 

     [[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]], 

     [[40, 40, 42, 43, 44], 
     [45, 46, 47, 48, 49], 
     [50, 51, 52, 53, 54], 
     [55, 56, 57, 58, 59]]]) 

(perform calculation) 

>>> new_data 
array([[[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]]) 

Điểm dữ liệu sẽ chứa số nổi âm và dương. Làm thế nào tôi có thể thực hiện các phép tính như vậy? Cảm ơn rất nhiều!

Tôi đã thử với numpy.unique, nhưng tôi nhận được "TypeError: unique() có đối số từ khóa không mong muốn 'return_inverse'" .Tôi đang sử dụng phiên bản 1.2.1 được cài đặt trên Unix và không hỗ trợ return_inverse. Tôi cũng đã thử chế độ, nhưng phải mất mãi mãi để xử lý số lượng lớn dữ liệu ... vậy có cách nào khác để có được các giá trị thường xuyên nhất không? Cảm ơn một lần nữa.

+2

Ý của bạn là gì? Tôi không hiểu câu hỏi. –

+0

Tôi sẽ bình luận thứ hai bởi @HenryGomersall - Tôi không có một Scooby câu hỏi của bạn là gì ... –

+0

Xin lỗi vì sự nhầm lẫn của bạn ... Tôi có nghĩa là các giá trị thường xuyên nhất .. – oops

Trả lời

14

Để tìm giá trị thường gặp nhất của một mảng phẳng, sử dụng unique, bincountargmax:

arr = np.array([5, 4, -2, 1, -2, 0, 4, 4, -6, -1]) 
u, indices = np.unique(arr, return_inverse=True) 
u[np.argmax(np.bincount(indices))] 

Để làm việc với một mảng đa chiều, chúng ta không cần phải lo lắng về unique, nhưng chúng tôi cần sử dụng apply_along_axis trên bincount:

arr = np.array([[5, 4, -2, 1, -2, 0, 4, 4, -6, -1], 
       [0, 1, 2, 2, 3, 4, 5, 6, 7, 8]]) 
axis = 1 
u, indices = np.unique(arr, return_inverse=True) 
u[np.argmax(np.apply_along_axis(np.bincount, axis, indices.reshape(arr.shape), 
           None, np.max(indices) + 1), axis=axis)] 

với dữ liệu của bạn:

data = np.array([ 
    [[ 0, 1, 2, 3, 4], 
    [ 5, 6, 7, 8, 9], 
    [10, 11, 12, 13, 14], 
    [15, 16, 17, 18, 19]], 

    [[ 0, 1, 2, 3, 4], 
    [ 5, 6, 7, 8, 9], 
    [10, 11, 12, 13, 14], 
    [15, 16, 17, 18, 19]], 

    [[40, 40, 42, 43, 44], 
    [45, 46, 47, 48, 49], 
    [50, 51, 52, 53, 54], 
    [55, 56, 57, 58, 59]]]) 
axis = 0 
u, indices = np.unique(arr, return_inverse=True) 
u[np.argmax(np.apply_along_axis(np.bincount, axis, indices.reshape(arr.shape), 
           None, np.max(indices) + 1), axis=axis)] 
array([[ 0, 1, 2, 3, 4], 
     [ 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14], 
     [15, 16, 17, 18, 19]]) 

NumPy 1.2, thực sự? Bạn có thể xấp xỉ np.unique(return_inverse=True) một cách hợp lý có hiệu quả sử dụng np.searchsorted (nó là một O bổ sung (n log n), vì vậy không nên thay đổi hiệu suất đáng kể):

u = np.unique(arr) 
indices = np.searchsorted(u, arr.flat) 
+0

chưa thử nhưng cảm ơn nhiều! – oops

+0

@ ecatmur, tôi đang sử dụng phiên bản vump 1.2.1 và nó không hỗ trợ np.unique (return_inverse) .. bất kỳ đề xuất nào? – oops

+0

@oops xem ở trên, bạn sẽ phải tự mình thử nghiệm vì tôi không biết mình sẽ tìm thấy phiên bản cũ như vậy ở đâu) – ecatmur

0

flatten mảng của bạn, sau đó tạo một collections.Counter từ đó. Như thường lệ, hãy đặc biệt quan tâm khi so sánh các số dấu phẩy động.

4

chức năng Sử dụng chế độ scipy của:

import numpy as np 
from scipy.stats import mode 

data = np.array([[[ 0, 1, 2, 3, 4], 
        [ 5, 6, 7, 8, 9], 
        [10, 11, 12, 13, 14], 
        [15, 16, 17, 18, 19]], 

       [[ 0, 1, 2, 3, 4], 
        [ 5, 6, 7, 8, 9], 
        [10, 11, 12, 13, 14], 
        [15, 16, 17, 18, 19]], 

       [[40, 40, 42, 43, 44], 
        [45, 46, 47, 48, 49], 
        [50, 51, 52, 53, 54], 
        [55, 56, 57, 58, 59]]]) 

print data 

# find mode along the zero-th axis; the return value is a tuple of the 
# modes and their counts. 
print mode(data, axis=0) 
+0

Cảm ơn bạn Taro Sato, nhưng phải mất rất nhiều thời gian để xử lý các mảng lớn ..any đề nghị để tăng tốc độ nó lên? – oops

+0

Được rồi, tôi nhận thấy rằng bạn muốn làm điều này với phao nổi. Để làm điều đó, tôi nghĩ rằng bạn cần một cách tiếp cận hơi khác, vì nó không thực sự có ý nghĩa để hỏi những gì là phổ biến nhất nổi, vì chỉ có một cơ hội nhỏ mà hai nổi trùng với các thí nghiệm lặp đi lặp lại. Bạn có thực sự cần phải tìm một điều kỳ lạ như vậy? Tôi biết (gần) sự phân bố mẫu của bạn, sau đó có các biện pháp tốt hơn để tính toán, chẳng hạn như trung bình và trung bình, để tìm ra con số nào có khả năng nhất trong mẫu của bạn. –

+0

người ta vẫn sử dụng rộng rãi gói scipy? Đọc ở đâu đó có nghĩa là từ scipy không được chấp nhận.Chỉ cần tò mò muốn biết :) –

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