2014-10-03 4 views
1

У меня три шестимерных Numpy массивов (работает на Python 3.4) формаКак транслировать Numpy 2D-массив в 6D-массив

Weights 
MyValue 
WeightedValue = Weight * MyValue 

Я хотел бы определить взвешенное среднее MyValue, взвешенный по Weights 'axis- j (который может находиться в диапазоне от 0 до 4) по другим осям, за исключением того, что ось 5 является постоянной.

(Так, когда j=2, мы усредняем по 0,1,3, и 4).

Затем я намерен принять это среднее и умножить на Weights и вычитать продукт от WeightedValue

Я намерен сделать это

NewArray = WeightedValue - Weight * fn(Weighted Value, Weights) 
NewMyValue = NewArray/Weights 

fn() будет среднее значение MyValue определяется как :

   the sum of Weighted Value using 4 axes (all except j and 5) 
< divided by >--------------------------------------------------------------- 
       the sum of Weights across 4 axes  (all except j and 5) 

Моя проблема заключается в следующем:

Среднее значение является 2D-массив, мне нужно fn() для создания 6D-массива, т.е. трансляции 2D-результат по сравнению с другими 4-х размеров

Я мог бы в крайнем случае создать ряд петель для итерации по осям j и оси 5 .FOR второй оси (к = 1) цикл будет выглядеть следующим образом

import numpy as np 
result = np.zeros((dim0,dim1,dim2,dim3,dim4,dim5)) 
for var1 in range(dim1): 
    for var5 in range(dim5): 
     result[:,dim1,:,:,:,dim5] = AverageValue[dim1,dim5] 

Но я надеюсь, есть более простой и общий способ

+5

Рассмотрите возможность добавления примерного кода, который работает автономно. Если вы знаете, как это сделать с помощью циклов, используйте их, и мы можем помочь вам удалить их. Проверьте [«как задать хороший вопрос»] (http://stackoverflow.com/help/how-to-ask). – farenorth

+0

Небольшой пример, который мы можем запустить, а также ваш желаемый результат из этого примера, может быть очень полезным. Таким образом, потенциальные ответчики точно знают, что вы пытаетесь сделать. –

ответ

1

На месте fn вы могли бы использовать:

j = 1; 
axes = tuple({0,1,2,3,4} - {j}) 
fn = WeightedValue.sum(axes, keepdims=True)/Weights.sum(axes, keepdims=True) 

Главное, очевидно, пройти keepdims=True, который держит одноэлементные размеры в результате для осей суммирования и делает результат, пригодный для дальнейшего вещания.

Смежные вопросы