gpt4 book ai didi

python - 2D bin (x,y) 并计算 10 个最深数据点 (z) 的平均值 (c)

转载 作者:太空宇宙 更新时间:2023-11-03 20:09:49 25 4
gpt4 key购买 nike

对于包含以下内容的数据集:

  • 坐标 x、y
  • 深度z
  • 某个值c

我想更有效地执行以下操作:

  1. 根据坐标 (x, y) 将数据集分入 2D bin 中
  2. 获取每个 bin 的 10 个最深数据点 (z)
  3. 计算每个 bin 这 10 个数据点的 c 平均值

最后显示带有计算平均值的二维热图。

我找到了一个可行的解决方案,但是对于小数据箱和/或大数据集来说,这需要很长时间。

是否有更有效的方法来达到相同的结果?

当前工作示例

示例数据框:

import numpy as np
from numpy.random import rand
import pandas as pd
import math
import matplotlib.pyplot as plt

n = 10000
df = pd.DataFrame({'x':rand(n), 'y':rand(n), 'z':rand(n), 'c':rand(n)})

对数据集进行分箱:

cell_size = 0.01

nx = math.ceil((max(df['x']) - min(df['x'])) / cell_size)
ny = math.ceil((max(df['y']) - min(df['y'])) / cell_size)

x_range = np.arange(0, nx)
y_range = np.arange(0, ny)

df['xbin'], x_edges = pd.cut(x=df['x'], bins=nx, labels=x_range, retbins=True)
df['ybin'], y_edges = pd.cut(x=df['y'], bins=ny, labels=y_range, retbins=True)

现在需要很长时间的代码:

df = df.groupby(['xbin', 'ybin']).apply(
lambda d: d.sort_values('z').head(10).mean())

为没有数据的 bin 更新一个空 DataFrame 并显示结果:

index = pd.MultiIndex.from_product([x_range, y_range],
names=['xbin', 'ybin'])

tot_df = pd.DataFrame(index=index, columns=['z', 'c'])
tot_df.update(df)

zval = tot_df['c'].astype('float').values
zval = zval.reshape((nx, ny))
zval = zval.T
zval = np.flipud(zval)

extent = [min(x_edges), max(x_edges), min(y_edges), max(y_edges)]

plt.matshow(zval, aspect='auto', extent=extent)
plt.show()

最佳答案

您可以使用np.searchsorted按x和y对行进行分箱,然后使用groupby获取10个深度值并计算平均值。由于 groupby 将维护每个组中的顺序,因此您可以在应用 bin 之前对值进行排序。不应用 groupby 会表现更好

df = pd.DataFrame({'x':rand(n), 'y':rand(n), 'z':rand(n), 'c':rand(n)})

df = df.sort_values("z", ascending=False)
bins = np.linspace(0, 1, 11)
df["bin_x"] = np.searchsorted(bins, df['x'].values) - 1
df["bin_y"] = np.searchsorted(bins, df['y'].values) - 1

result = df.groupby(["bin_x", "bin_y"]).head(10)
result.groupby(["bin_x", "bin_y"])["c"].mean()

结果

bin_x  bin_y
0 0 0.369531
1 0.601803
2 0.554452
3 0.575464
4 0.455198
...
9 5 0.469838
6 0.420772
7 0.367549
8 0.379200
9 0.523083
Name: c, Length: 100, dtype: float64

关于python - 2D bin (x,y) 并计算 10 个最深数据点 (z) 的平均值 (c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58775094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com