2016-11-01 16 views
6

Làm thế nào sẽ một (hiệu quả) thực hiện như sau:NumPy cuộn dọc trong mảng 2ngày

x = np.arange(49) 
x2 = np.reshape(x, (7,7)) 

x2 
array([[ 0, 1, 2, 3, 4, 5, 6], 
     [ 7, 8, 9, 10, 11, 12, 13], 
     [14, 15, 16, 17, 18, 19, 20], 
     [21, 22, 23, 24, 25, 26, 27], 
     [28, 29, 30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39, 40, 41], 
     [42, 43, 44, 45, 46, 47, 48]]) 

Từ đây tôi muốn để cuộn một vài điều. Tôi muốn cuộn 0,7,14,21 v.v. vì vậy 14 đến đầu trang. Sau đó, tương tự với 4,11,18,25 v.v. vì vậy 39 đến đầu trang.
quả nên là:

x2 
array([[14, 1, 2, 3, 39, 5, 6], 
     [21, 8, 9, 10, 46, 12, 13], 
     [28, 15, 16, 17, 4, 19, 20], 
     [35, 22, 23, 24, 11, 26, 27], 
     [42, 29, 30, 31, 18, 33, 34], 
     [ 0, 36, 37, 38, 25, 40, 41], 
     [ 7, 43, 44, 45, 32, 47, 48]]) 

Tôi nhìn lên numpy.roll, ở đây và google nhưng không thể tìm thấy như thế nào ai có thể làm điều này.
Đối với cuộn ngang, tôi có thể làm:

np.roll(x2[0], 3, axis=0) 

x3 
array([4, 5, 6, 0, 1, 2, 3]) 

Nhưng làm thế nào để trả lại mảng đầy đủ với sự thay đổi cuộn này như một bản sao mới?

Trả lời

0

Bạn cần phải ghi đè lên cột

ví dụ:

x2[:,0] = np.roll(x2[:,0], 3) 
3

cuộn với một sự thay đổi tiêu cực:

x2[:, 0] = np.roll(x2[:, 0], -2) 

cuộn với một sự thay đổi tích cực:

x2[:, 4] = np.roll(x2[:, 4], 2) 

cho :

>>>x2 
array([[14, 1, 2, 3, 39, 5, 6], 
     [21, 8, 9, 10, 46, 12, 13], 
     [28, 15, 16, 17, 4, 19, 20], 
     [35, 22, 23, 24, 11, 26, 27], 
     [42, 29, 30, 31, 18, 33, 34], 
     [ 0, 36, 37, 38, 25, 40, 41], 
     [ 7, 43, 44, 45, 32, 47, 48]]) 
0

Đây là một cách để cuộn nhiều cột trong một đi với advanced-indexing -

# Params 
cols = [0,4] # Columns to be rolled 
dirn = [2,-2] # Offset with direction as sign 

n = x2.shape[0] 
x2[:,cols] = x2[np.mod(np.arange(n)[:,None] + dirn,n),cols] 

mẫu chạy -

In [45]: x2 
Out[45]: 
array([[ 0, 1, 2, 3, 4, 5, 6], 
     [ 7, 8, 9, 10, 11, 12, 13], 
     [14, 15, 16, 17, 18, 19, 20], 
     [21, 22, 23, 24, 25, 26, 27], 
     [28, 29, 30, 31, 32, 33, 34], 
     [35, 36, 37, 38, 39, 40, 41], 
     [42, 43, 44, 45, 46, 47, 48]]) 

In [46]: cols = [0,4,5] # Columns to be rolled 
    ...: dirn = [2,-2,4] # Offset with direction as sign 
    ...: n = x2.shape[0] 
    ...: x2[:,cols] = x2[np.mod(np.arange(n)[:,None] + dirn,n),cols] 
    ...: 

In [47]: x2 # Three columns rolled 
Out[47]: 
array([[14, 1, 2, 3, 39, 33, 6], 
     [21, 8, 9, 10, 46, 40, 13], 
     [28, 15, 16, 17, 4, 47, 20], 
     [35, 22, 23, 24, 11, 5, 27], 
     [42, 29, 30, 31, 18, 12, 34], 
     [ 0, 36, 37, 38, 25, 19, 41], 
     [ 7, 43, 44, 45, 32, 26, 48]])