2016-06-24 13 views
5

Có bất kỳ chức năng nào để xếp nhóm mảng này xuống dưới cột đầu tiên không?Có nhóm numpy nào theo chức năng không?

tôi không thể tìm thấy bất kỳ câu trả lời tốt qua internet ..

>>> a 
array([[ 1, 275], 
     [ 1, 441], 
     [ 1, 494], 
     [ 1, 593], 
     [ 2, 679], 
     [ 2, 533], 
     [ 2, 686], 
     [ 3, 559], 
     [ 3, 219], 
     [ 3, 455], 
     [ 4, 605], 
     [ 4, 468], 
     [ 4, 692], 
     [ 4, 613]]) 

đầu ra Wanted:

array([[[275, 441, 494, 593]], 
     [[679, 533, 686]], 
     [[559, 219, 455]], 
     [[605, 468, 692, 613]]], dtype=object) 
+0

Tôi nghĩ bạn có nghĩa là một danh sách chứ không phải danh sách danh sách? –

+1

Còn về giải pháp gấu trúc thì sao? – MaxU

Trả lời

3
n = unique(a[:,0]) 
array([ list(a[a[:,0]==i,1]) for i in n]) 

kết quả đầu ra:

array([[275, 441, 494, 593], [679, 533, 686], [559, 219, 455], 
     [605, 468, 692, 613]], dtype=object) 
+1

để có chính xác câu trả lời tương tự, vì anh ta muốn 'mảng ([[x] cho x trong [danh sách (a [a [:, 0] == i, 1]) cho i trong n]])' – efirvida

+0

có, giải pháp của bạn trả về những gì anh ta yêu cầu. Nhưng tôi chỉ giả định rằng anh ta thực sự muốn có một loạt các danh sách và không phải là một danh sách vô danh các danh sách chứa một phần tử đơn lẻ – Gioelelm

+0

hahaha, tôi biết! – efirvida

4

Gói numpy_indexed (từ chối trách nhiệm: Tôi là aut của nó hor) nhằm mục đích lấp đầy khoảng trống này. Tất cả các phép toán được lập chỉ mục được lập chỉ mục đầy đủ, và không có thuật toán O (n^2) nào bị tổn hại trong quá trình tạo thư viện này.

import numpy_indexed as npi 
npi.group_by(a[:, 0]).split(a[:, 1]) 

Lưu ý rằng nó thường là hiệu quả hơn để trực tiếp tính toán các đặc tính liên quan trong nhóm đó (ví dụ, group_by (phím) .mean (giá trị)), chứ không phải là tách đầu tiên vào một danh sách/mảng lởm chởm.

0

Lấy cảm hứng từ thư viện của Eelco Hoogendoorn, nhưng không có thư viện của mình và sử dụng thực tế là cột đầu tiên của mảng của bạn luôn tăng lên.

>>> np.split(a[:, 1], np.cumsum(np.unique(a[:, 0], return_counts=True)[1])[:-1]) 
[array([275, 441, 494, 593]), 
array([679, 533, 686]), 
array([559, 219, 455]), 
array([605, 468, 692, 613])] 

Tôi đã không "timeit" nhưng điều này có lẽ là cách nhanh hơn để đạt được các câu hỏi:

  • Không python loop mẹ đẻ
  • danh sách kết quả là mảng NumPy, trong trường hợp bạn cần phải làm cho hoạt động numPy khác về họ, không chuyển đổi mới sẽ là cần thiết
  • phức tạp như O (n)

PS: tôi đã viết một dòng tương tự vì tôi cần phải "nhóm theo" kết quả của np.nonzero:

>>> indexes, values = np.nonzero(...) 
>>> np.split(values, np.cumsum(np.unique(indexes, return_counts=True)[1])) 
Các vấn đề liên quan