2013-12-12 22 views
12

Giả sử tôi có một mảng r của thứ nguyên (n, m). Tôi muốn trộn các cột của mảng đó.Trộn các cột của một mảng với Numpy

Nếu tôi sử dụng numpy.random.shuffle(r), nó sẽ xáo trộn các dòng. Làm thế nào tôi chỉ có thể trộn các cột? Vì vậy, cột đầu tiên trở thành cột thứ hai và cột thứ ba là cột thứ nhất, vv, ngẫu nhiên.

Ví dụ:

đầu vào:

array([[ 1, 20, 100], 
     [ 2, 31, 401], 
     [ 8, 11, 108]]) 

đầu ra:

array([[ 20, 1, 100], 
     [ 31, 2, 401], 
     [ 11, 8, 108]]) 

Trả lời

13

Trong khi hỏi tôi nghĩ về lẽ tôi có thể xáo trộn các mảng hoán:

np.random.shuffle(np.transpose(r)) 

Có vẻ như nó thực hiện công việc. Tôi đánh giá cao ý kiến ​​để biết nếu đó là một cách tốt để đạt được điều này.

+1

Đó là. Tôi đề nghị 'r.T' cho transpose, mặc dù. – user2357112

+1

@ user2357112 là 'r.T' chính xác giống như' np.transpose (r) 'nhưng ngắn hơn? –

+1

Có hiệu quả giống hệt nhau. Có một sự khác biệt rất nhỏ đối với mảng 1-d, nhưng có thể bạn sẽ không sử dụng 'T' hoặc' transpose' cho mảng 1-d. – user2357112

6

Đối với một trục chung, bạn có thể làm theo các mô hình:

>>> import numpy as np 
>>> 
>>> a = np.array([[ 1, 20, 100, 4], 
...    [ 2, 31, 401, 5], 
...    [ 8, 11, 108, 6]]) 
>>> 
>>> print a[:, np.random.permutation(a.shape[1])] 
[[ 4 1 20 100] 
[ 5 2 31 401] 
[ 6 8 11 108]] 
>>> 
>>> print a[np.random.permutation(a.shape[0]), :] 
[[ 1 20 100 4] 
[ 2 31 401 5] 
[ 8 11 108 6]] 
>>> 
+0

Ví dụ thứ hai của bạn dường như không bị xáo trộn ... – onewhaleid

2

Vì vậy, thêm một bước nữa từ câu trả lời của bạn:

Edit: Tôi rất dễ dàng có thể bị nhầm lẫn thế nào điều này đang làm việc, vì vậy tôi m chèn sự hiểu biết của tôi về trạng thái của ma trận ở mỗi bước.

r == 1 2 3 
    4 5 6 
    6 7 8 

r = np.transpose(r) 

r == 1 4 6 
    2 5 7 
    3 6 8   # Columns are now rows 

np.random.shuffle(r) 

r == 2 5 7 
    3 6 8 
    1 4 6   # Columns-as-rows are shuffled 

r = np.transpose(r) 

r == 2 3 1 
    5 6 4 
    7 8 6   # Columns are columns again, shuffled. 

sau đó sẽ trở lại đúng hình dạng, với các cột được sắp xếp lại.

Chuyển vị của transpose của ma trận == ma trận đó, hoặc, [A^T]^T == A. Vì vậy, bạn cần thực hiện chuyển vị thứ hai sau khi trộn (vì chuyển vị không phải là một shuffle) để cho nó được trong hình dạng thích hợp của nó một lần nữa.

Chỉnh sửa: Câu trả lời của OP bỏ qua việc lưu trữ các chuyển đổi và thay vào đó cho phép phát ngẫu nhiên hoạt động trên r như thể nó đã xảy ra.

+0

'np.random.shuffle' không trả về mảng. –

+0

Vì vậy, tôi thấy, đã chỉnh sửa. Bất kể bước cuối cùng là cần thiết để trả lại ma trận của bạn về hình dạng ban đầu. – Matt

+0

@Matt: Không, không phải vậy. 'transpose' trả về một khung nhìn của mảng ban đầu. Khi bạn xáo trộn mảng được chuyển đổi, bản gốc được xáo trộn theo cách mong muốn. Không cần phải chuyển đổi hai lần. – user2357112

0

Nói chung nếu bạn muốn để shuffle một mảng NumPy dọc theo trục i:

def shuffle(x, axis = 0): 
    n_axis = len(x.shape) 
    t = np.arange(n_axis) 
    t[0] = axis 
    t[axis] = 0 
    xt = np.transpose(x.copy(), t) 
    np.random.shuffle(xt) 
    shuffled_x = np.transpose(xt, t) 
    return shuffled_x 

shuffle(array, axis=i) 
Các vấn đề liên quan