2012-05-09 40 views
8

Tôi có mảng 3 trục có 3 phần tử có các phần tử là 3 chiều. Tôi muốn trung bình chúng và trả về cùng một hình dạng của mảng. Chức năng trung bình bình thường loại bỏ 3 kích thước và thay thế nó với mức trung bình (như dự kiến):mảng numpy trung bình nhưng giữ nguyên hình dạng

a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]], 
       [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32) 

b = np.average(a, axis=2) 
# b = [[0.2, 0.3], 
#  [0.4, 0.7]] 

quả cần:

# b = [[[0.2, 0.2, 0.2], [0.3, 0.3, 0.3]], 
#  [[0.4, 0.4, 0.4], [0.7, 0.7, 0.7]]] 

Bạn có thể làm điều này tao nhã hay tôi chỉ phải lặp qua mảng trong Python (sẽ chậm hơn rất nhiều so với hàm Numpy mạnh).

Bạn có thể đặt đối số Dtype, cho hàm np.mean, thành một mảng 1D không?

Cảm ơn.

+2

Big fan hâm mộ của những gì bạn muốn nhìn thấy trong câu hỏi. – lukecampbell

+0

Trong hầu hết các trường hợp tôi có thể tưởng tượng, phát sóng sẽ làm điều đó mà không yêu cầu mảng 3D. – tillsten

Trả lời

3
>>> import numpy as np 
>>> a = np.array([[[0.1, 0.2, 0.3], [0.2, 0.3, 0.4]], 
...    [[0.4, 0.4, 0.4], [0.7, 0.6, 0.8]]], np.float32) 
>>> b = np.average(a, axis=2) 
>>> b 
array([[ 0.2  , 0.29999998], 
     [ 0.40000001, 0.69999999]], dtype=float32) 
>>> c = np.dstack((b, b, b)) 
>>> c 
array([[[ 0.2  , 0.2  , 0.2  ], 
     [ 0.29999998, 0.29999998, 0.29999998]], 

     [[ 0.40000001, 0.40000001, 0.40000001], 
     [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32) 
+0

Tại sao điều này lại bị giảm giá? – AJP

6

Ok, THẬN TRỌNG Tôi không có bậc thầy của tôi trong numpyology nêu ra, nhưng chỉ chơi xung quanh, tôi đã đưa ra:

>>> np.average(a,axis=-1).repeat(a.shape[-1]).reshape(a.shape) 
array([[[ 0.2  , 0.2  , 0.2  ], 
     [ 0.29999998, 0.29999998, 0.29999998]], 

     [[ 0.40000001, 0.40000001, 0.40000001], 
     [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32) 
+0

Tôi thích nó, đó là tốt hơn so với những gì tôi đã đưa ra. – lukecampbell

+0

Điều này hoạt động tốt .... bất kỳ lợi thế nào so với câu trả lời của Lobster hoặc Bago? – AJP

+0

Đó là một dòng và nó hoạt động với tất cả các hình dạng và kích thước mảng miễn là bạn đang lấy trung bình dọc theo trục cuối cùng. – user545424

5

bạn đã xem xét sử dụng phát sóng? Here là thông tin thêm về phát sóng nếu bạn chưa quen với khái niệm này.

Dưới đây là một ví dụ sử dụng broadcast_arrays, hãy ghi nhớ rằng b sản xuất ở đây bởi broadcast_arrays phải được coi là chỉ đọc, bạn nên tạo một bản sao nếu bạn muốn viết thư cho nó:

>>> b = np.average(a, axis=2)[:, :, np.newaxis] 
>>> b, _ = np.broadcast_arrays(b, a) 
>>> b 
array([[[ 0.2  , 0.2  , 0.2  ], 
     [ 0.29999998, 0.29999998, 0.29999998]], 

     [[ 0.40000001, 0.40000001, 0.40000001], 
     [ 0.69999999, 0.69999999, 0.69999999]]], dtype=float32) 
+0

Đó là một liên kết tuyệt vời, cảm ơn. – AJP

+0

Và cũng là một câu trả lời hay. – AJP

1

Đây là một phương pháp mà tránh làm bản:

a = a.T 
a[:] = a.mean(axis=0) 
a = a.T 

Hoặc nếu bạn không muốn ghi đè lên a:

b = np.empty_like(a) 
b = b.T 
b[:] = a.mean(axis=-1).T 
b = b.T 
+0

Và một câu trả lời tuyệt vời khác. Làm thế nào để tôi chọn ?! Cảm ơn! :) – AJP

0

này là dành cho một trục tùy ý:

array là mảng ndimentional và axis là trục trung bình

np.repeat(np.expand_dims(np.mean(array, axis), axis), array.shape[axis], axis) 
Các vấn đề liên quan