2014-10-26 40 views
11

Giả sử tôi có một NumPy 2D mảng A:Splitting một NumPy mảng thành hai mảng

>>> import numpy as np 
>>> A=np.arange(30).reshape(3,10) 
>>> A 
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]]) 

tôi cần để có được hai mảng B và C với các thuộc tính sau:

B = array([[ 0, 3, 4, 5, 6, 7, 8, 9], 
      [10, 13, 14, 15, 16, 17, 18, 19], 
      [20, 23, 24, 25, 26, 27, 28, 29]]) 

C = array([[ 1, 2], 
      [11, 12], 
      [21, 22]]) 

là gì cách dễ nhất để thực hiện việc này?

Lưu ý rằng tôi phải nhận tất cả các bộ C (2 cột liền kề) và B (A là không có C). Tôi đã thử các cấu trúc NumPy khác nhau như np.delete, np.hstack nhưng không có gì có vẻ hoạt động ở các điều kiện góc như trong ví dụ trên.

Trả lời

10

Một trong những cách đơn giản nhất là sử dụng lập chỉ mục để chọn cột thích hợp:

>>> A[:, [1, 2]] # choose all rows from columns 1-2 (gives C) 
array([[ 1, 2], 
     [11, 12], 
     [21, 22]]) 

>>> A[:, np.r_[0, 3:10]] # choose all rows from columns 0, 3-9 (gives B) 
array([[ 0, 3, 4, 5, 6, 7, 8, 9], 
     [10, 13, 14, 15, 16, 17, 18, 19], 
     [20, 23, 24, 25, 26, 27, 28, 29]]) 

Ngoài ra, bạn có thể thử hsplit chia tay A và sau đó nối bit trở lại với nhau. Điều này cảm thấy kém hiệu quả hơn phương pháp lập chỉ mục ở trên mặc dù:

>>> splits = np.hsplit(A, [1, 3]) 
>>> B = np.hstack((splits[0], splits[2])) 
>>> C = splits[1] 
4

Bạn có thể sử dụng mảng lập chỉ mục ưa thích:

B = A[:, [0] + list(range(3, A.shape[1]))] 
C = A[:, [1, 2]] 

nơi:

  • dấu phẩy ngăn cách các chỉ số bạn muốn đi từ mỗi chiều.
  • hành : kể để thực hiện tất cả các yếu tố đó chiều
  • sử dụng một chuỗi các số nguyên sẽ xác định những yếu tố của kích thước tương ứng cần được thực hiện (ví dụ. [1, 2])
3

Đối C bạn có thể sử dụng cắt đơn giản :

>>> A[:,1:3] 
array([[ 1, 2], 
     [11, 12], 
     [21, 22]]) 

Đối B sử dụng numpy.hstack trên hai lát A:

0.123.
>>> np.hstack((A[:,:1], A[:,3:])) 
array([[ 0, 3, 4, 5, 6, 7, 8, 9], 
     [10, 13, 14, 15, 16, 17, 18, 19], 
     [20, 23, 24, 25, 26, 27, 28, 29]]) 
>>> 
Các vấn đề liên quan