Как эффективно назначить свойства только точкам в сфере из трех информационных фреймов, содержащих свойства в декартовых координатах? - PullRequest
0 голосов
/ 15 февраля 2020

Моя проблема заключается в следующем. Я создал фрейм данных с 20000 точек для х и плотности. х варьируется от [-1,1]. Это представитель не только х, но и у и г. Плотность на поверхности сферы - это то, что я хочу, и это сумма трех плотностей (интерференция).

Я делаю это грубой силой. Будет ли лучший способ? Я спрашиваю, потому что мне придется циклически сдвигать плотности и получать новые интерференционные картины и проводить оптимизацию, чтобы соответствовать микроволновому фону Cosmi c. Из-за высокого разрешения CMB количество точек велико.

def createSphere(a1,a2,a3,dfX):
    dfX["xP"]= np.roll(dfX.x, a0)
    dfX["DensityX"]= np.roll(dfX.DensitySTD, a1)
    dfX["DensityY"]= np.roll(dfX.DensitySTD, a2)
    dfX["DensityZ"]= np.roll(dfX.DensitySTD, a3)
    dfY=dfX[dfX.x<=2]
    dfY.x=dfY.x-1
    dfsphere=pd.DataFrame(columns=["i", "j", "k","x","y","z", "density"])
    for ind,inda in enumerate(itertools.product(dfY.index,dfY.index,dfY.index)):
            if (dfY.iloc[inda[0]].x**2 +dfY.iloc[inda[1]].x**2 +dfY.iloc[inda[2]].x**2 -1)<=0.001:
                dens = dfY.iloc[inda[0]].DensityX +dfY.iloc[inda[1]].DensityY +dfY.iloc[inda[2]].DensityZ 
                dfsphere.loc[ind,"i"]=inda[0]
                dfsphere.loc[ind, "j"]=inda[1]
                dfsphere.loc[ind, "k"]=inda[2]
                dfsphere.loc[ind,"x"]=dfY.iloc[inda[0]].x
                dfsphere.loc[ind, "y"]=dfY.iloc[inda[1]].x
                dfsphere.loc[ind, "z"]=dfY.iloc[inda[2]].x
                dfsphere.loc[ind,"density"] = dens
    return dfY, dfsphere

dfY, dfsphere = createSphere(a1,a2,a3,dfX)de here
...