Câu hỏi Tìm chỉ mục trong đó các phần tử thay đổi giá trị


Giả sử tôi có

>>> v
array([1, 1, 1, 1, 1, 2, 2, 2, 3, 4, 3, 4, 3, 4, 3, 4, 5, 5, 5])

Có cách nào hiệu quả để tìm mỗi chỉ mục có thay đổi giá trị không? Ví dụ, tôi muốn một số kết quả như,

>>> index_of_changed_values(v)
[0, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16]

Nếu điều này là không thể với một số thói quen gumpy, một cách nhanh chóng để làm điều đó trong python là gì? Nó cũng sẽ hữu ích cho tôi để được giới thiệu đến một số hướng dẫn tốt gumpy kể từ khi tôi là một người mới bắt đầu gầy.


18
2017-10-01 20:49


gốc




Các câu trả lời:


Bạn có thể nhận được chức năng này bằng cách so sánh từng phần tử với hàng xóm của nó;

v[:-1] != v[1:]


array([False, False, False, False,  True, False, False,  True,  True,
    True,  True,  True,  True,  True,  True,  True, False, False], dtype=bool)

để có được các chỉ số bạn sử dụng hàm "where"

np.where(v[:-1] != v[1:])[0]

array([ 4,  7,  8,  9, 10, 11, 12, 13, 14, 15])

Từ đây, bạn có thể thêm phần tử đầu tiên và thêm một phần tử để có cùng một lược đồ lập chỉ mục mà bạn có trong câu hỏi của mình.


35
2017-10-01 21:03



điều này hoạt động hoàn hảo cảm ơn bạn. Lời giải thích tuyệt vời quá. - liang
@ kith Vì vậy, đơn giản, rất hoàn hảo, vì vậy OMG! - a r


Tương tự như câu trả lời @kith, nhưng yêu cầu ít kết quả hơn:

np.where(np.roll(v,1)!=v)[0]

Không cần phải thêm 0 hoặc thêm 1. Thí dụ:

>>> v=np.array([1, 1, 1, 2, 2, 3, 3, 4, 4, 4])
>>> np.where(np.roll(v,1)!=v)[0]
array([0, 3, 5, 7])

EDIT: như @ Praveen đã đề cập, điều này không thành công khi phần tử cuối cùng và đầu tiên bằng nhau.


0
2017-10-12 02:02



Điều này sẽ không hoạt động nếu mảng trông giống như [1, 1, 1, 2, 2, 2, 1, 1, 1]. tức là, giá trị đầu tiên và cuối cùng giống nhau, vì vậy bạn sẽ không nhận được chỉ mục '0' như bạn mong đợi ... - Praveen


Có lẽ Đó là bởi vì Python 3.5 nhưng các mã trên không làm việc cho tôi.

Giống như v[:-1] != v[1:] không trả lại iterable nhưng một đĩa đơn bool.

Tôi đã đưa ra cách hiểu danh sách sau bằng zip và enumerate

[ i for i, (x, y) in enumerate(zip(v[:-1],v[1:])) if x!=y] 

Ai đó tìm kiếm giải pháp trong py3.5 có thể thấy điều này hữu ích!


-1
2018-05-19 04:47



trên mã được sử dụng numpy - ash
@ash: Ý tôi là v[:-1] != v[1:] không trở lại mảng (hoặc thường hơn cấu trúc giống mảng) của bools mà lần lượt không làm việc với numpy.where trong python 3,5. Và câu trả lời được nhắm đến những người sẽ đến câu hỏi này và sử dụng python 3.5. Và có, tôi biết trên mã sử dụng numpy và điều này không. - cipher
đó là bc họ phải là mảng sumpy không python danh sách - ash