2012-03-05 57 views
26

Tôi có một mảng giá trị NumPy. Tôi muốn tính số lượng các giá trị này trong một phạm vi cụ thể cho biết x < 100 và x> 25. Tôi đã đọc về bộ đếm, nhưng nó dường như chỉ hợp lệ đối với các giá trị specif không phạm vi giá trị. Tôi đã tìm kiếm, nhưng không tìm thấy bất cứ điều gì liên quan đến vấn đề cụ thể của tôi. Nếu ai đó có thể chỉ cho tôi hướng tới các tài liệu thích hợp, tôi sẽ đánh giá cao nó. Cảm ơn bạnLàm thế nào để đếm các giá trị trong một phạm vi nhất định trong một mảng Numpy?

Tôi đã cố gắng này

X = array(X) 
    for X in range(25, 100): 
     print(X) 

Nhưng nó chỉ mang lại cho tôi những con số ở giữa 25 và 99.

EDIT Dữ liệu Tôi đang sử dụng đã được tạo ra bởi chương trình khác. Sau đó, tôi đã sử dụng tập lệnh để đọc dữ liệu và lưu trữ dưới dạng danh sách. Sau đó tôi lấy danh sách và chuyển nó vào một mảng bằng mảng (r).

Sửa

Kết quả của việc chạy

>>> a[0:10] 
array(['29.63827346', '40.61488812', '25.48300065', '26.22910525', 
    '42.41172923', '20.15013315', '34.95323355', '13.03604098', 
    '29.71097606', '9.53222141'], 
    dtype='<U11') 
+0

@Đánh giá đã làm điều đó cảm ơn bạn rất nhiều !! Tôi đã thử phương pháp của Sven sau khi reconverting mảng và nó đã làm việc hoàn hảo! Cảm ơn một lần nữa – Surfcast23

Trả lời

48

Nếu mảng của bạn được gọi a, số phần tử thực hiện 25 < x < 100

((25 < a) & (a < 100)).sum() 

Khái niệm (25 < a) & (a < 100) kết quả trong một Boolean mảng có hình dạng giống như a với giá trị True cho tất cả các yếu tố thỏa mãn điều kiện. Tổng hợp trên mảng Boolean này xử lý các giá trị True1False giá trị là 0.

+1

@SvenI đã thử phương pháp của bạn, nhưng có lỗi này '' TypeError: loại không thể đặt hàng: int() Surfcast23

+1

@ Surfcast23: [Làm việc cho tôi.] (Https: //gist.github. com/1975690) Bạn đang sử dụng phiên bản nào của NumPy và Python? –

+0

Tôi đang chạy Python 3.2 – Surfcast23

6

Bạn có thể sử dụng histogram. Dưới đây là một cách sử dụng ví dụ cơ bản:

>>> import numpy 
>>> a = numpy.random.random(size=100) * 100 
>>> numpy.histogram(a, bins=(0.0, 7.3, 22.4, 55.5, 77, 79, 98, 100)) 
(array([ 8, 14, 34, 31, 0, 12, 1]), 
array([ 0. , 7.3, 22.4, 55.5, 77. , 79. , 98. , 100. ])) 

Trong trường hợp cụ thể của bạn, nó sẽ giống như thế này:

>>> numpy.histogram(a, bins=(25, 100)) 
(array([73]), array([ 25, 100])) 

Thêm vào đó, khi bạn có một danh sách các chuỗi, bạn phải xác định rõ kiểu dữ liệu, để numpy biết để tạo ra một mảng các phao thay vì một danh sách các chuỗi.

>>> strings = [str(i) for i in range(10)] 
>>> numpy.array(strings) 
array(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], 
     dtype='|S1') 
>>> numpy.array(strings, dtype=float) 
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) 
+0

Tôi sẽ cố gắng cảm ơn! – Surfcast23

+0

@ Surfcast23, vâng, cái này là mục đích chung hơn, nhưng nếu bạn thực sự chỉ cần một thùng, [Sven] (http://stackoverflow.com/a/9560228/577088) sẽ nhanh hơn. – senderle

+0

Tôi chạy mã và nhận '' (mảng ([- 481], dtype = int32), mảng ([25, 100])) '' Điều gì khiến tôi quan tâm là dấu âm, làm cách nào để diễn giải nó? – Surfcast23

3

Câu trả lời của Sven là cách để thực hiện nếu bạn không muốn xử lý thêm giá trị khớp.
Hai ví dụ sau trở lại bản sao chỉ với những giá trị phù hợp:

np.compress((25 < a) & (a < 100), a).size 

Hoặc:

a[(25 < a) & (a < 100)].size 

phiên Ví dụ thông dịch viên:

>>> import numpy as np 
>>> a = np.random.randint(200,size=100) 
>>> a 
array([194, 131, 10, 100, 199, 123, 36, 14, 52, 195, 114, 181, 138, 
     144, 70, 185, 127, 52, 41, 126, 159, 39, 68, 118, 124, 119, 
     45, 161, 66, 29, 179, 194, 145, 163, 190, 150, 186, 25, 61, 
     187, 0, 69, 87, 20, 192, 18, 147, 53, 40, 113, 193, 178, 
     104, 170, 133, 69, 61, 48, 84, 121, 13, 49, 11, 29, 136, 
     141, 64, 22, 111, 162, 107, 33, 130, 11, 22, 167, 157, 99, 
     59, 12, 70, 154, 44, 45, 110, 180, 116, 56, 136, 54, 139, 
     26, 77, 128, 55, 143, 133, 137, 3, 83]) 
>>> np.compress((25 < a) & (a < 100),a).size 
34 
>>> a[(25 < a) & (a < 100)].size 
34 

Những ví dụ trên sử dụng một "chút khôn ngoan và "(&) để thực hiện tính toán theo nguyên tố dọc theo hai mảng boolean mà bạn tạo cho mục đích so sánh.
Một cách khác để viết câu trả lời tuyệt vời của Sven, ví dụ, là:

np.bitwise_and(25 < a, a < 100).sum() 

Các mảng boolean chứa True giá trị khi các trận đấu điều kiện, và False khi nó không.
Một khía cạnh tiền thưởng của các giá trị boolean là True tương đương với 1 và False để 0.

+0

@Sevn và Adam, tôi vẫn còn khá mới để trăn ~ 6 tháng không phải là rất ổn định mặc dù. Các bạn có thể giải thích cách thức và lý do các kịch bản của bạn hoạt động không? Cảm ơn bạn – Surfcast23

+0

Hoặc chỉ cho tôi hướng tới nơi tôi có thể đọc trên đó. – Surfcast23

+0

@ Surfcast23: Tôi đã thêm một chút giải thích. Giữ ở đó! – bernie

2

Tôi nghĩ @Sven Marnach trả lời là khá tốt đẹp, bởi vì nó hoạt động trong trên mảng NumPy bản thân mà sẽ được nhanh chóng và hiệu quả (C triển khai).

Tôi muốn đặt thử nghiệm vào một điều kiện như 25 < x < 100, vì vậy tôi có lẽ sẽ làm điều đó một cái gì đó như thế này:

len([x for x in a.ravel() if 25 < x < 100])

+1

Tốt. Để sử dụng gen-expr: 'sum (1 cho i trong a.ravel() nếu 25 bernie

+0

cũng tốt. lúc đầu tôi đã cố gắng sử dụng 'len()' trên một máy phát và ngạc nhiên của tôi nó không hoạt động – wim

+0

@wim: 'len()' không hoạt động với các biểu thức máy phát bởi vì trình lặp thường không có độ dài hữu hạn. Đây là lý do tại sao phương pháp 'tổng hợp (1…)' là tốt hơn: nó có một dấu chân bộ nhớ cố định và nhỏ hơn nhiều, vì bạn không phải tạo một danh sách trung gian. – EOL

5

Dựa trên cách tiếp cận tốt Sven, bạn cũng có thể làm trực tiếp hơn:

numpy.count_nonzero((25 < a) & (a < 100)) 

này đầu tiên tạo ra một mảng các phép toán với một boolean cho mỗi số đầu vào trong mảng a, và sau đó đếm số (tức là True) giá trị phi False (mà cung cấp cho các numbe r của số phù hợp). Tuy nhiên, hãy chú ý rằng phương pháp này nhanh gấp đôi phương pháp .sum() của Sven, trên một dãy số 100k (NumPy 1.6.1, Python 2.7.3) - khoảng 300 µs so với 150 µs.

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