У меня есть некоторые двумерные данные, которые я хочу преобразовать в массив более высокой размерности, используя отображенное среднее (или некоторую другую статистику).
Исходные данные являются двумерными с формой 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[:,:,:,:])