Сопоставленное усреднение от двумерных до многомерных массивов - PullRequest
1 голос
/ 07 ноября 2019

У меня есть некоторые двумерные данные, которые я хочу преобразовать в массив более высокой размерности, используя отображенное среднее (или некоторую другую статистику).

Исходные данные являются двумерными с формой MxN, и я хочу отобразить это на 4D массив (форма AxBxCxD). Признаки, отображаемые из исходных данных в каждое из четырех измерений, создаются либо из 2D (в форме MxN) переменных, либо из плиточных 1D (в форме Mx1) переменных.

Ниже приведен рабочий пример того, что я пытаюсьделать. Хотя это, кажется, работает, я хотел бы знать, есть ли функция, которая позволила бы мне:

1) покончить с циклами for и

2) разрешитьпеременное количество измерений (3D, 4D, 5D и т. д.) для массива (ов) назначения.

import numpy as np

# create data I want to conditionally average  (MxN array)
zz = np.random.rand(100,10)

# create variables used to define binning for conditional averaging 
# each variable defines one dimension of the final 4 dimensional array
aa = np.random.rand(100,10)*10
bb = np.random.rand(100,1) + 5
cc = np.random.rand(100,1) * 25
dd = np.random.rand(100,1)* 50 + 100

# define binning boundaries
binsaa = np.array([2, 4, 6, 8])
binsbb = np.array([5.1, 5.5, 5.7])
binscc = np.array([12])
binsdd = np.array([110, 133])

# create bin indicies
idaa = np.digitize(aa,binsaa,right=True)
idbb = np.digitize(bb,binsbb,right=True)
idcc = np.digitize(cc,binscc,right=True)
iddd = np.digitize(dd,binsdd,right=True)

# tile some of the indicies so they match the shape of the data to be averaged
idbbt = np.tile(idbb,[1,10])
idcct = np.tile(idcc,[1,10])
idddt = np.tile(iddd,[1,10])

# make empty destination 4 dimensional arrays 
avgxx = np.zeros([5,4,2,3])
cntxx = np.zeros([5,4,2,3])

# use for loops to average original data and place in 4-dim array
for ixa in range(5):
    for ixb in range(4):
        for ixc in range(2):
            for ixd in range(3):
                idz = (idaa == ixa) &  (idbbt == ixb) &  (idcct == ixc) &  (idddt == ixd)
                avgxx[ixa,ixb,ixc,ixd] = np.average(zz[idz])
                cntxx[ixa,ixb,ixc,ixd] = np.sum(idz)

print(avgxx[:,:,:,:])
print(cntxx[:,:,:,:])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...