2013-06-12 24 views
7

Tôi có một mảng NumPy như thế này:thay zero trong mảng NumPy với giá trị trung bình

foo_array = [38,26,14,55,31,0,15,8,0,0,0,18,40,27,3,19,0,49,29,21,5,38,29,17,16] 

Tôi muốn thay thế tất cả các số không có giá trị trung bình của toàn bộ mảng (trong đó các giá trị zero không để được bao gồm trong việc tính trung bình)

cho đến nay tôi đã này xảy ra:

foo_array = [38,26,14,55,31,0,15,8,0,0,0,18,40,27,3,19,0,49,29,21,5,38,29,17,16] 
foo = np.array(foo_array) 
foo = np.sort(foo) 
print "foo sorted:",foo 
#foo sorted: [ 0 0 0 0 0 3 5 8 14 15 16 17 18 19 21 26 27 29 29 31 38 38 40 49 55] 
nonzero_values = foo[0::] > 0 
nz_values = foo[nonzero_values] 
print "nonzero_values?:",nz_values 
#nonzero_values?: [ 3 5 8 14 15 16 17 18 19 21 26 27 29 29 31 38 38 40 49 55] 
size = np.size(nz_values) 
middle = size/2 
print "median is:",nz_values[middle] 
#median is: 26 

có một cách thông minh để đạt được điều này với cú pháp numPy?

Cảm ơn bạn

Trả lời

16

giải pháp này có lợi thế của numpy.median:

import numpy as np 
foo_array = [38,26,14,55,31,0,15,8,0,0,0,18,40,27,3,19,0,49,29,21,5,38,29,17,16] 
foo = np.array(foo_array) 
# Compute the median of the non-zero elements 
m = np.median(foo[foo > 0]) 
# Assign the median to the zero elements 
foo[foo == 0] = m 

Chỉ cần một lưu ý thận trọng, trung bình cho mảng của bạn (không có zero) là 23,5 nhưng khi viết này dính trong 23.

+0

Đợi chút ... Trung bình phải là 26? Khi mảng phần tử khác không được sắp xếp (3 5 8 14 15 16 17 18 19 21 26 27 29 29 31 38 38 40 49 55), giá trị ở giữa là 26. – slashdottir

+0

Không sao, bạn nói đúng. Đó là một giải pháp tốt – slashdottir

+0

Vâng, có 20 phần tử khác 0. Hai ở giữa là 21 và 26. Trung bình thường được tính là trung bình của hai ở giữa cho một số nguyên tố, vì vậy chúng tôi nhận được 23,5. Cảm ơn bạn đã upvote! – bbayles

1
foo2 = foo[:] 
foo2[foo2 == 0] = nz_values[middle] 

Thay vì foo2, bạn chỉ có thể cập nhật foo nếu bạn muốn. Cú pháp mảng thông minh của Numpy có thể kết hợp một vài dòng mã bạn đã tạo. Ví dụ, thay vì,

nonzero_values = foo[0::] > 0 
nz_values = foo[nonzero_values] 

Bạn chỉ có thể làm

nz_values = foo[foo > 0] 

Bạn có thể tìm hiểu thêm về "lập chỉ mục ưa thích" trong documentation.

+0

rất mát mẻ, hoạt động tuyệt vời, cảm ơn bạn! – slashdottir