Python 将3D数据划分为立方体子集并计算立方体内的点
我有一个数据档案。(xx,yy,EXTRA)我想把数据分成大小相等的网格。例如,假设数据为:Python 将3D数据划分为立方体子集并计算立方体内的点,python,python-3.x,numpy,Python,Python 3.x,Numpy,我有一个数据档案。(xx,yy,EXTRA)我想把数据分成大小相等的网格。例如,假设数据为: xx=np.array([0.1, 0.2, 3, 4.1, 3, 0.1]) yy=np.array([0.35, 0.15, 1.5, 4.5, 3.5, 3]) EXTRA=np.array([0.01,0.003,2.002,4.004,0.5,0.2]) 我想制作尺寸为1x1的正方形网格,然后获得网格上每个点的“额外”总和 这就是我试过的 import math for
xx=np.array([0.1, 0.2, 3, 4.1, 3, 0.1])
yy=np.array([0.35, 0.15, 1.5, 4.5, 3.5, 3])
EXTRA=np.array([0.01,0.003,2.002,4.004,0.5,0.2])
我想制作尺寸为1x1的正方形网格,然后获得网格上每个点的“额外”总和
这就是我试过的
import math
for i in range(0,5):
for j in range(0,5):
for x,y in zip(xx,yy):
k=math.floor(x)
kk=math.floor(y)
if i<=k<i+1.0 and j<=kk<j+1.0:
print("(x,y)=" ,x,",",y,",","(i,j)=",i,",",j ,"Unkow sum of EXTRA")
因此,前两个点具有坐标(0.1,0.35)和(0.2,0.15),并且位于cuadrant(0,0)内。查看“EXTRA”,我知道在cuadrant(0,0)中,我应该得到“EXTRA”的和应该是sum_EXTRA=0.01+0.003。然而,我不知道如何从代码的角度来求和
更多信息
我真正的问题是在一个大立方体盒子里有“粒子”,我想把盒子细分成更小的盒子,在每个更小的盒子里,我想得到它们的“质量”之和,在我的例子中是“额外=质量”
我怀疑我对粒子是否属于象限进行分类的方法很慢,这可能是一个问题,因为我有很多数据。如果有任何建议,我们将不胜感激。将三个数组与zip组合,并根据
xx
和yy
值对结果进行排序。然后根据xx
和yy
值将其分组。获取每组的额外值之和
import operator, itertools
important = operator.itemgetter(0,1)
xtra = operator.itemgetter(-1)
data = sorted(zip(xx.astype(int),yy.astype(int),EXTRA),key=important)
gb = itertools.groupby(data,important)
for key,group in gb:
values = list(map(xtra,group))
print(key,values,sum(values))
# or just
#print(key,sum(map(xtra,group)))
使用熊猫数据帧的相同概念
import pandas as pd
xx, yy = xx.astype(int),yy.astype(int)
In [25]: df = pd.DataFrame({'xx':xx,'yy':yy,'EXTRA':EXTRA})
In [26]: df.groupby(['xx','yy'])['EXTRA'].sum()
Out[26]:
xx yy
0 0 0.013
3 0.200
3 1 2.002
3 0.500
4 4 4.004
Name: EXTRA, dtype: float64
我怀疑。。。速度很慢
-您是否进行了任何测试以验证这一点?还没有,在完成全部工作之前,我正在使用较小的样本。不过,我认为我找到了一种更简单的方法来做我想做的事情,如果可行,我会将解决方案作为评论发布。你也可以看看3D中最快的解决方案。pandas
似乎在这里获胜,但如果使用降维,你可以实现2-3倍的速度提升。
import pandas as pd
xx, yy = xx.astype(int),yy.astype(int)
In [25]: df = pd.DataFrame({'xx':xx,'yy':yy,'EXTRA':EXTRA})
In [26]: df.groupby(['xx','yy'])['EXTRA'].sum()
Out[26]:
xx yy
0 0 0.013
3 0.200
3 1 2.002
3 0.500
4 4 4.004
Name: EXTRA, dtype: float64