Trong khi câu trả lời lặp dựa trên là hoàn toàn tốt đẹp, nếu bạn đang làm việc với mảng NumPy (như bạn đề cập rằng bạn đang có) có những cách tốt hơn và nhanh hơn các lựa chọn điều:
import numpy as np
data = np.array([
[100002, 2006, 1.1, 0.01, 6352],
[100002, 2006, 1.2, 0.84, 304518],
[100002, 2006, 2, 1.52, 148219],
[100002, 2007, 1.1, 0.01, 6292],
[10002, 2006, 1.1, 0.01, 5968],
[10002, 2006, 1.2, 0.25, 104318],
[10002, 2007, 1.1, 0.01, 6800],
[10002, 2007, 4, 2.03, 25446],
[10002, 2008, 1.1, 0.01, 6408] ])
subset1 = data[data[:,0] == 100002]
subset2 = data[data[:,0] == 10002]
này mang lại
subset1:
array([[ 1.00002e+05, 2.006e+03, 1.10e+00, 1.00e-02, 6.352e+03],
[ 1.00002e+05, 2.006e+03, 1.20e+00, 8.40e-01, 3.04518e+05],
[ 1.00002e+05, 2.006e+03, 2.00e+00, 1.52e+00, 1.48219e+05],
[ 1.00002e+05, 2.007e+03, 1.10e+00, 1.00e-02, 6.292e+03]])
subset2:
array([[ 1.0002e+04, 2.006e+03, 1.10e+00, 1.00e-02, 5.968e+03],
[ 1.0002e+04, 2.006e+03, 1.20e+00, 2.50e-01, 1.04318e+05],
[ 1.0002e+04, 2.007e+03, 1.10e+00, 1.00e-02, 6.800e+03],
[ 1.0002e+04, 2.007e+03, 4.00e+00, 2.03e+00, 2.5446e+04],
[ 1.0002e+04, 2.008e+03, 1.10e+00, 1.00e-02, 6.408e+03]])
Nếu bạn không biết trước các giá trị duy nhất trong cột đầu tiên, bạn có thể sử dụng numpy.unique1d
hoặc hàm dựng sẵn set
để tìm chúng.
Chỉnh sửa: Tôi chỉ nhận ra rằng bạn muốn chọn dữ liệu mà bạn có sự kết hợp độc đáo của hai cột ... Trong trường hợp đó, bạn có thể làm điều gì đó như thế này:
col1 = data[:,0]
col2 = data[:,1]
subsets = {}
for val1, val2 in itertools.product(np.unique(col1), np.unique(col2)):
subset = data[(col1 == val1) & (col2 == val2)]
if np.any(subset):
subsets[(val1, val2)] = subset
(Tôi đang lưu trữ các tập con như là một dict, với khóa là một bộ kết hợp ... Có chắc chắn khác (và tốt hơn, tùy thuộc vào những gì bạn đang làm) cách để làm điều này!)
Cảm ơn! Nhìn lại điều này rõ ràng đến nỗi tôi nên tự mình thử nó, nhưng lời giải thích của bạn rất hoàn chỉnh. Tuy nhiên, bạn có biết chúng ta có thể đạt được bao nhiêu tốc độ bằng cách sử dụng phương pháp này so với các vòng lặp không?Tôi nghĩ rằng vòng lặp là khá nhanh quá! – user308827
@ user308827 - Họ đang có, nhưng nếu bạn đang làm việc với các mảng numpy, và không phải danh sách, bằng cách sử dụng một cách numpy làm việc sẽ nhanh hơn. Nói chung, việc lặp lại thông qua một mảng toàn bộ là chậm. Các giải pháp dựa trên Iterator phải lặp qua từng phần tử trong python. Khi bạn chọn một tập hợp con của một mảng numpy bằng cách sử dụng mảng boolean numpy, lặp lại được thực hiện đằng sau hậu trường trong mã được biên dịch. (Tôi quá đơn giản ở đây, nhưng đó là ý chính, dù sao đi nữa). Về cơ bản, nếu bạn đang sử dụng mảng numpy để chứa dữ liệu của bạn, nó nhanh hơn để hoạt động trên chúng với các chức năng numpy. –
Ngoài ra, có cách nào kết hợp 2 điều kiện trong tập hợp con không? Ví dụ: subset1 = data [(dữ liệu [:, 0] == 100002) và (dữ liệu [:, 1] == 2007)] dường như không hoạt động. cảm ơn! – user308827