Tôi giả sử bạn đang tìm kiếm một giải pháp cụ thể, cụ thể hơn là hiểu danh sách đơn giản hoặc cho vòng lặp. Một cách tiếp cận có thể là sử dụng kỹ thuật rolling window để tìm kiếm các cửa sổ có kích thước phù hợp. Dưới đây là các chức năng rolling_window:
>>> def rolling_window(a, size):
... shape = a.shape[:-1] + (a.shape[-1] - size + 1, size)
... strides = a.strides + (a. strides[-1],)
... return numpy.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
...
Sau đó, bạn có thể làm một cái gì đó giống như
>>> a = numpy.arange(10)
>>> numpy.random.shuffle(a)
>>> a
array([7, 3, 6, 8, 4, 0, 9, 2, 1, 5])
>>> rolling_window(a, 3) == [8, 4, 0]
array([[False, False, False],
[False, False, False],
[False, False, False],
[ True, True, True],
[False, False, False],
[False, False, False],
[False, False, False],
[False, False, False]], dtype=bool)
Để làm điều này thực sự hữu ích, bạn phải giảm nó dọc theo trục 1 sử dụng all
:
>>> numpy.all(rolling_window(a, 3) == [8, 4, 0], axis=1)
array([False, False, False, True, False, False, False, False], dtype=bool)
Sau đó, bạn có thể sử dụng tuy nhiên bạn sẽ sử dụng một mảng boolean. Một cách đơn giản để lấy chỉ mục ra:
>>> bool_indices = numpy.all(rolling_window(a, 3) == [8, 4, 0], axis=1)
>>> numpy.mgrid[0:len(bool_indices)][bool_indices]
array([3])
Để biết danh sách, bạn có thể điều chỉnh một trong các phương thức tương tự này.
Đối rất mảng lớn và subarrays, bạn có thể tiết kiệm bộ nhớ như thế này:
>>> windows = rolling_window(a, 3)
>>> sub = [8, 4, 0]
>>> hits = numpy.ones((len(a) - len(sub) + 1,), dtype=bool)
>>> for i, x in enumerate(sub):
... hits &= numpy.in1d(windows[:,i], [x])
...
>>> hits
array([False, False, False, True, False, False, False, False], dtype=bool)
>>> hits.nonzero()
(array([3]),)
Mặt khác, điều này có lẽ sẽ chậm hơn. Làm thế nào chậm hơn nhiều là không rõ ràng mà không cần thử nghiệm; xem câu trả lời của Jamie cho một tùy chọn bảo tồn bộ nhớ khác để kiểm tra các kết quả dương tính giả. Tôi tưởng tượng rằng sự khác biệt tốc độ giữa hai giải pháp này sẽ phụ thuộc rất nhiều vào bản chất của đầu vào.
Bạn có thể chuyển đổi danh sách thành chuỗi để so sánh không? 'x = ''. join (str (x) cho x trong a)' Sau đó sử dụng phương thức find với các chuỗi kết quả? Hay họ phải giữ lại danh sách? – danem