2010-06-04 47 views
6

bằng Python, được cung cấp ma trận n x p, ví dụ: 4 x 4, làm thế nào tôi có thể trả về một ma trận là 4 x 2 mà chỉ đơn giản là trung bình hai cột đầu tiên và hai cột cuối cùng cho tất cả 4 hàng của ma trận?ma trận trung bình hiệu quả

ví dụ: đưa ra:

a = array ([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15 , 16]])

trả về ma trận có giá trị trung bình là [:, 0] và [:, 1] và giá trị trung bình của [:, 2] và [:, 3]. Tôi muốn điều này làm việc cho một ma trận tùy ý của n x p giả định rằng số cột tôi tính trung bình của n rõ ràng là chia hết cho n.

hãy để tôi làm rõ: đối với mỗi hàng, tôi muốn lấy mức trung bình của hai cột đầu tiên, sau đó là mức trung bình của hai cột cuối cùng. Vì vậy, nó sẽ là:

1 + 2/2, 3 + 4/2 < - dòng 1 của ma trận mới 5 + 6/2, 7 + 8/2 < - dòng 2 của ma trận mới, vv

sẽ tạo ra ma trận 4 x 2 thay vì 4 x 4.

cảm ơn.

+0

bạn muốn có ma trận 4x2, nhưng những gì bạn mô tả (với âm thanh [:, 0], v.v.) sẽ giống như là ma trận 1x4 –

Trả lời

1

Đó là một chút không rõ ràng gì sẽ xảy ra cho ma trận với n> 4, nhưng mã này sẽ làm những gì bạn muốn:

a = N.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], dtype=float) 
avg = N.vstack((N.average(a[:,0:2], axis=1), N.average(a[:,2:4], axis=1))).T 

này mang lại avg =

array([[ 1.5, 3.5], 
     [ 5.5, 7.5], 
     [ 9.5, 11.5], 
     [ 13.5, 15.5]]) 
1

Đây là một cách để làm điều đó . Bạn chỉ cần thay đổi groupsize để làm cho nó hoạt động với các kích thước khác như bạn đã nói, mặc dù tôi không hoàn toàn chắc chắn những gì bạn muốn.

groupsize = 2 
out = np.hstack([np.mean(x,axis=1,out=np.zeros((a.shape[0],1))) for x in np.hsplit(a,groupsize)]) 

mang

array([[ 1.5, 3.5], 
    [ 5.5, 7.5], 
    [ 9.5, 11.5], 
    [ 13.5, 15.5]]) 

cho out. Hy vọng nó cung cấp cho bạn một số ý tưởng về cách làm chính xác những gì bạn muốn làm. Bạn có thể làm cho groupsize phụ thuộc vào kích thước của a chẳng hạn.

5

Làm thế nào để sử dụng một số môn toán? Bạn có thể xác định ma trận M = [[0.5,0],[0.5,0],[0,0.5],[0,0.5]] để A*M là những gì bạn muốn.

from numpy import array, matrix 

A = array([[1, 2, 3, 4], 
      [5, 6, 7, 8], 
      [9, 10, 11, 12], 
      [13, 14, 15, 16]]) 
M = matrix([[0.5,0], 
      [0.5,0], 
      [0,0.5], 
      [0,0.5]]) 
print A*M 

Tạo M cũng khá đơn giản, các mục nhập là 1/n hoặc 0.

4

Reshape - được nghĩa - reshape

>>> a.reshape(-1, a.shape[1]//2).mean(1).reshape(a.shape[0],-1) 
array([[ 1.5, 3.5], 
     [ 5.5, 7.5], 
     [ 9.5, 11.5], 
     [ 13.5, 15.5]]) 

là nghĩa vụ phải làm việc cho bất kỳ kích thước mảng, và định hình lại không tạo một bản sao.

Các vấn đề liên quan