Điều này có thể (gần như?) Được thực hiện trong tinh khiết numpy
sử dụng các mảng được che dấu và các thủ đoạn sải chân. Đầu tiên, chúng ta tạo ra mặt nạ của chúng tôi:
>>> indices = numpy.arange(a.size)
>>> mask = ~((indices >= start[:,None]) & (indices < end[:,None]))
Hoặc đơn giản hơn:
>>> mask = (indices < start[:,None]) | (indices >= end[:,None])
Mặt nạ được False
(tức là giá trị không đeo mặt nạ) dành cho những chỉ số đó là >=
với giá trị bắt đầu và <
giá trị cuối . (Cắt bằng None
(còn gọi là numpy.newaxis
) sẽ thêm một thứ nguyên mới, cho phép phát sóng.) Bây giờ mặt nạ của chúng tôi trông như thế này:
>>> mask
array([[ True, False, True, True, True, True, True, True, True,
True, True, True],
[ True, True, True, True, True, False, False, False, False,
False, True, True],
[ True, True, True, True, True, True, True, False, False,
True, True, True]], dtype=bool)
Bây giờ chúng ta phải căng mảng để phù hợp với mặt nạ sử dụng stride_tricks
:
>>> as_strided = numpy.lib.stride_tricks.as_strided
>>> strided = as_strided(a, mask.shape, (0, a.strides[0]))
>>> strided
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]], dtype=int16)
này trông giống như một mảng 3x12, nhưng mỗi điểm liên tiếp tại cùng một ký ức. Bây giờ chúng ta có thể kết hợp chúng thành một mảng bị che dấu:
>>> numpy.ma.array(strided, mask=mask)
masked_array(data =
[[-- 1 -- -- -- -- -- -- -- -- -- --]
[-- -- -- -- -- 5 6 7 8 9 -- --]
[-- -- -- -- -- -- -- 7 8 -- -- --]],
mask =
[[ True False True True True True True True True True True True]
[ True True True True True False False False False False True True]
[ True True True True True True True False False True True True]],
fill_value = 999999)
Điều này không hoàn toàn giống như những gì bạn đã yêu cầu, nhưng nó sẽ hoạt động tương tự.
Tôi đang gặp một thời gian khó khăn để hiểu những gì 'start' và 'end' có để làm điều này. Mặc dù vậy, tôi không nghĩ rằng bạn sẽ có thể làm điều này một cách đầy đủ trong các mảng cứng nhắc như hình chữ nhật. – mgilson
YOu có thể thử tạo các giá trị đầu cuối làm bộ dữ liệu trong danh sách. – Keith
Vì không có giải pháp numpy kinh điển ở đây, nếu bạn cần thêm ý tưởng, bạn có thể muốn thêm vào những gì bạn thực sự làm với nó sau đó và nếu các lát có một số thuộc tính đặc biệt. – seberg