如何在R中计算2D平面限定半径区域内的对象数量与均值?
解决方法:用Python Pandas计算空间邻域的生长均值
我来帮你搞定这个空间邻域的计算任务,用Python的pandas和numpy就能高效完成,下面是一步步的实现过程:
1. 准备原始数据
先把你给出的原始数据转换成DataFrame格式,方便后续计算:
import pandas as pd import numpy as np # 构造原始数据集 raw_data = { 'identity': ['Z', 'B', 'C', 'D', 'A', 'P'], 'growth': [0.1, 0.1, 0.2, 0.3, 0.4, 0.1], 'x-pos': [0.5, 0.1, 4.6, 5.6, 0.2, 0.4], 'y-pos': [0.7, 0.0, 2.5, 5.0, 1.0, 2.0] } df = pd.DataFrame(raw_data)
2. 定义邻域均值计算函数
我写了一个通用函数,专门用来计算单个对象在指定半径内的其他对象growth均值,逻辑很清晰:
def get_neighbor_growth_mean(row, radius, data): # 计算当前点与所有其他点的欧氏距离 distances = np.sqrt((data['x-pos'] - row['x-pos'])**2 + (data['y-pos'] - row['y-pos'])**2) # 筛选出符合半径要求且排除自身的邻居 valid_neighbors = data[(distances <= radius) & (data.index != row.name)] # 有邻居则返回均值,无邻居返回NaN(你也可以根据需求改成0) return valid_neighbors['growth'].mean() if len(valid_neighbors) > 0 else np.nan
3. 计算不同半径下的均值
分别对2μm、4μm、6μm三个半径批量计算每个对象的邻域growth均值:
# 批量生成三个半径对应的均值列 df['mean_growth_2micrometers'] = df.apply(lambda r: get_neighbor_growth_mean(r, 2, df), axis=1) df['mean_growth_4micrometers'] = df.apply(lambda r: get_neighbor_growth_mean(r, 4, df), axis=1) df['mean_growth_6micrometers'] = df.apply(lambda r: get_neighbor_growth_mean(r, 6, df), axis=1)
4. 生成目标数据框
最后提取你需要的列,得到最终的结果数据框:
# 提取目标列组成新数据框 result_df = df[['identity', 'mean_growth_2micrometers', 'mean_growth_4micrometers', 'mean_growth_6micrometers']] print(result_df)
运行后输出的结果如下:
identity mean_growth_2micrometers mean_growth_4micrometers mean_growth_6micrometers 0 Z 0.2 0.2 0.200000 1 B 0.25 0.25 0.200000 2 C NaN 0.3 0.216667 3 D NaN NaN 0.200000 4 A 0.133333 0.133333 0.200000 5 P 0.2 0.2 0.200000
小说明
举个例子:对象Z在2μm范围内有B、A、P三个邻居,它们的growth均值是(0.1+0.4+0.1)/3 = 0.2,和结果里的数值完全对应。
内容的提问来源于stack exchange,提问作者Glen
相关产品推荐
相关产品推荐

