【问题标题】:Dividing 3D data into cubic subsets and counting the points inside the cube将 3D 数据划分为立方体子集并计算立方体内的点
【发布时间】:2020-10-18 02:38:12
【问题描述】:

我有一个数据存档。 (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 的方形网格,然后获得网格上每个点的“EXTRA”之和。

这是我尝试过的

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")

我作为输出获得

(x,y)= 0.1 , 0.35 , (i,j)= 0 , 0 Unkow sum of extra
(x,y)= 0.2 , 0.15 , (i,j)= 0 , 0 Unkow sum of extra
(x,y)= 0.1 , 3.0 , (i,j)= 0 , 3 Unkow sum of extra
(x,y)= 3.0 , 1.5 , (i,j)= 3 , 1 Unkow sum of extra
(x,y)= 3.0 , 3.5 , (i,j)= 3 , 3 Unkow sum of extra
(x,y)= 4.1 , 4.5 , (i,j)= 4 , 4 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。但是我不知道如何用代码来计算总和。

更多信息

我真正的问题是我在一个大立方体盒子里有“粒子”,我想把盒子细分成更小的盒子,在每个小盒子里我想获得它们“质量”的总和,在我的示例中为“EXTRA=mass”。

我怀疑我对一个粒子是否属于象限进行分类的方式很慢,由于我有很多数据,这可能会出现问题。任何建议都将不胜感激。

【问题讨论】:

  • I suspect that ... is slow - 您是否进行了任何测试来验证这一点?
  • 还没有,在完成全部工作之前,我正在处理较小的样本。但是我认为我找到了一种更简单的方法来做我想做的事,如果可行,我会将解决方案作为评论发布。
  • 你也可以看看my research 最快的3D解决方案。
  • pandas 似乎在这里获胜,但如果使用降维,您可以实现 2 到 3 倍的加速。

标签: python python-3.x numpy


【解决方案1】:

将三个数组与 zip 组合,并根据 xxyy 值对结果进行排序。然后将其按 xxyy 值分组。获取每个组的 EXTRA 值的总和。

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)))

使用 Pandas DataFrame 的相同概念。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-07
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多