Đối với trường hợp chúng ta đều biết trục và lặp lại - và lặp lại là một đại lượng vô hướng (cùng một giá trị cho tất cả các yếu tố), chúng tôi có thể xây dựng một chỉ số cắt như thế này:
In [1117]: a=np.array([[1, 1, 2, 2],[3, 3, 4, 4]])
In [1118]: axis=1; repeats=2
In [1119]: ind=[slice(None)]*a.ndim
In [1120]: ind[axis]=slice(None,None,a.shape[axis]//repeats)
In [1121]: ind
Out[1121]: [slice(None, None, None), slice(None, None, 2)]
In [1122]: a[ind]
Out[1122]:
array([[1, 2],
[3, 4]])
@Eelco's
sử dụng take
làm cho nó dễ dàng hơn để tập trung vào một trục, nhưng yêu cầu một danh sách các chỉ mục, không phải một lát.
Nhưng repeat
cho phép tính số lần lặp lại khác nhau.
In [1127]: np.repeat(a1,[2,3],axis=1)
Out[1127]:
array([[1, 1, 2, 2, 2],
[3, 3, 4, 4, 4]])
Biết axis=1
và repeats=[2,3]
chúng ta nên xây dựng thể quyền take
lập chỉ mục (có lẽ với cumsum
). Cắt lát sẽ không hoạt động.
Nhưng nếu chúng tôi chỉ biết trục và lặp lại không xác định thì có thể chúng tôi cần một số loại hoạt động unique
hoặc set
như trong câu trả lời @redratear's
.
In [1128]: a2=np.repeat(a1,[2,3],axis=1)
In [1129]: y=[list(set(c)) for c in a2]
In [1130]: y
Out[1130]: [[1, 2], [3, 4]]
Một giải pháp take
với danh sách repeats
. Điều này sẽ chọn cuối cùng của mỗi khối lặp lại:
In [1132]: np.take(a2,np.cumsum([2,3])-1,axis=1)
Out[1132]:
array([[1, 2],
[3, 4]])
Câu trả lời đã xóa sử dụng unique
; đây là hàng của tôi bằng cách sử dụng hàng unique
In [1136]: np.array([np.unique(row) for row in a2])
Out[1136]:
array([[1, 2],
[3, 4]])
unique
được tốt hơn so với set
để sử dụng này vì nó duy trì trật tự phần tử. Có một vấn đề khác với unique
(hoặc thiết lập) - điều gì xảy ra nếu giá trị ban đầu có giá trị lặp lại, ví dụ: [[1,2,1,3],[3,3,4,1]]
.
Đây là trường hợp rất khó để suy ra mẫu lặp lại từ kết quả. Tôi phải xem xét tất cả các hàng đầu tiên.
In [1169]: a=np.array([[2,1,1,3],[3,3,2,1]])
In [1170]: a1=np.repeat(a,[2,1,3,4], axis=1)
In [1171]: a1
Out[1171]:
array([[2, 2, 1, 1, 1, 1, 3, 3, 3, 3],
[3, 3, 3, 2, 2, 2, 1, 1, 1, 1]])
Nhưng cumsum
trên lặp lại biết giải quyết nó độc đáo:
In [1172]: ind=np.cumsum([2,1,3,4])-1
In [1173]: ind
Out[1173]: array([1, 2, 5, 9], dtype=int32)
In [1174]: np.take(a1,ind,axis=1)
Out[1174]:
array([[2, 1, 1, 3],
[3, 3, 2, 1]])
Làm thế nào nói chung của một 'repeat' đang nói gì vậy? Bạn có biết các thông số lặp lại trước thời hạn không? Một số duy nhất lặp lại trên một trục đã biết là dễ dàng. Nhưng lặp lại có thể sử dụng một số khác nhau cho mỗi phần tử. – hpaulj
@hpaulj Như tôi đã nói trong câu hỏi, tôi muốn nghịch đảo chính xác của hàm np.repeat. tức là số lần lặp lại cố định –
Xem câu trả lời của tôi để biết thêm chi tiết về lý do tôi hỏi câu hỏi này. – hpaulj