2009-06-07 37 views
22

tôi muốn để tính toán giá trị trung bình của một mảng bằng Python theo hình thức này:Làm thế nào để sử dụng numpy với giá trị 'Không' trong Python?

Matrice = [1, 2, None] 

Tôi chỉ muốn có giá trị None tôi bỏ qua việc tính toán numpy.mean nhưng tôi không thể tìm ra cách để làm đi.

+2

+1: Câu hỏi này có thể đặc biệt có liên quan đối với mảng được nhập khẩu từ một cơ sở dữ liệu, nơi các giá trị đôi khi có thể NULL. – EOL

Trả lời

10

Bạn đang tìm kiếm cho masked arrays. Đây là một ví dụ.

import MA 
a = MA.array([1, 2, None], mask = [0, 0, 1]) 
print "average =", MA.average(a) 

Thật không may, mảng được che giấu không được hỗ trợ kỹ lưỡng, vì vậy bạn phải nhìn xung quanh để xem những gì có thể và không thể thực hiện được với chúng.

+2

một thành viên chức năng đã giúp rất nhiều được 'lấp đầy'. đã đưa mảng mặt nạ trở lại một mảng bình thường, chứa đầy một giá trị mà tôi sẽ nhận ra là không hợp lệ (NaN, -9999, bất kể người dùng của bạn cần gì). – mariotomo

+0

Hiệu suất của các mảng được che chắn cũng thấp hơn đáng kể so với các mảng thường xuyên khi thực hiện là Python thuần túy. Nếu bạn đang xử lý dữ liệu lớn, hãy lưu ý đến các tác động hiệu suất. – timbo

3

đã không sử dụng NumPy, nhưng trong python tiêu chuẩn mà bạn có thể lọc ra None sử dụng danh sách comprehensions hoặc chức năng lọc

>>> [i for i in [1, 2, None] if i != None] 
[1, 2] 
>>> filter(lambda x: x != None, [1, 2, None]) 
[1, 2] 

và sau đó trung bình kết quả bỏ qua None

+4

'x! = None' thường được viết là' x không phải là None' (PEP 8: "So sánh với những người độc thân như Không nên luôn luôn được thực hiện với 'is' hoặc 'is not', không bao giờ là toán tử bình đẳng.") – EOL

3

Bạn cũng có thể kludge với các giá trị như NaN hoặc Inf.

In [1]: array([1, 2, None]) 
Out[1]: array([1, 2, None], dtype=object) 

In [2]: array([1, 2, NaN]) 
Out[2]: array([ 1., 2., NaN]) 

Thực ra, nó thậm chí không thể là kludge. Wikipedia says:

NaN có thể được sử dụng để thể hiện giá trị thiếu trong tính toán.

Thực ra, điều này không có tác dụng đối với hàm mean(), tuy nhiên, không bao giờ xảy ra. :)

In [20]: mean([1, 2, NaN]) 
Out[20]: nan 
+6

Trên thực tế, 'có nghĩa là (a [~ isnan (a)])' lựa chọn rõ ràng tất cả các giá trị không phải NaN hoạt động. – u0b34a0f6ae

+1

@kaizer bình luận của bạn là một viên ngọc. giải pháp tuyệt vời, cảm ơn! – Agos

1

Bạn cũng có thể sử dụng bộ lọc, vượt qua None với nó, nó sẽ lọc đối tượng phi Đúng vậy, cũng 0,: D Vì vậy, sử dụng nó khi bạn không cần phải quá 0.

>>> filter(None,[1, 2, None]) 
[1, 2] 
6

Bạn có thể sử dụng scipy cho rằng:

import scipy.stats.stats as st 
m=st.nanmean(vec) 
+0

Cảm ơn, đây chỉ là những gì tôi cần! – max

+1

Điều này không hoạt động. 'a = [1,2, None]' và sau đó kết quả 'st.nanmean (a)' trong một TypeError. – Nate

+1

Có, bạn nói đúng, nó hoạt động trên numpy.nan, không phải trên Không. Nó hữu ích nhất khi tính toán giá trị trung bình trên vectơ cứng. –

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