python - 在 DataFrame 中查找相邻元素(行和列)的平均值
问题描述
我有一个图像,我根据它的像素强度创建了一个 DataFrame。由此,我想创建一个网格,在该网格中找到该网格中每个正方形内的平均强度,用 2x2 像素表示。这样做是为了捕获更大的强度区域,以便将它们与背景噪声区分开来。(我认为最好将其包含在内以提供上下文。)
在 DataFrame 中,这将转化为从一组 2 个相邻行和列中找到 4 个值的平均值。
因此,为了说明问题,假设我们有以下 DataFrame:
df=pd.DataFrame({'A':(np.linspace(1,4,num=4)),'B':(np.linspace(5,8,num=4)),'C':(np.linspace(9,12,num=4)), 'D':(np.linspace(13,16,num=4))})
由此,我们想要创建一个对应于每个平方平均值的 DataFrame。在这种情况下,它将对应于以下内容(例如,3 将是具有值 (1,5,2,6) 的 2x2 正方形的平均值,11.5 将是 (9, 13, 10, 14):
df_mean=DataFrame({'A':pd.Series([3,11.5]),'B':pd.Series([5.5,13.5])})
如果问题仍然不清楚,想象一下原始 DataFrame 并在中间画一条垂直线和一条水平线。因此,这将产生 4 个盒子。在 4 个框中的每一个中,您将找到 4 个值。我想计算每个框的平均值并将其插入到由框的平均值组成的新 DataFrame 中。
PS:不幸的是,我还不知道如何显示 DataFrames 本身,而不仅仅是代码。打印功能不起作用。我希望这不会太麻烦。
非常感谢!
解决方案
您可以使用底层numpy
数组非常有效地执行此操作:
def square_mean(arr, y, x):
yy, xx = arr.shape
vals = arr.reshape(y, yy//y, x, xx//x).mean((1,3))
return vals
pd.DataFrame(square_mean(df.values, 2, 2))
0 1
0 3.5 11.5
1 5.5 13.5
该解决方案之所以有效,是因为对数组进行了一些巧妙的整形,以下是整形的工作原理:
yy, xx = arr.shape
vals = arr.reshape(2, yy//2, 2, xx//2)
print(vals)
[[[[ 1. 5.]
[ 9. 13.]]
[[ 2. 6.]
[10. 14.]]]
[[[ 3. 7.]
[11. 15.]]
[[ 4. 8.]
[12. 16.]]]]
如您所见,数组已被重新整形为块,然后我们可以使用它来计算平均值。
此解决方案将扩展到所有输入大小,只需选择x
沿 x 轴y
的块数和沿 y 轴的块数:
df = pd.DataFrame(np.random.randint(1, 5, (10, 10)))
0 1 2 3 4 5 6 7 8 9
0 1 3 4 2 3 3 3 2 1 2
1 3 3 4 1 3 4 4 4 1 3
2 2 3 2 2 4 4 1 1 1 1
3 1 2 1 2 1 3 1 1 2 3
4 2 2 3 4 3 2 4 3 4 2
5 3 3 1 4 2 1 2 3 1 3
6 2 1 3 4 3 2 3 4 3 4
7 2 3 4 2 1 1 1 1 3 2
8 4 3 2 2 2 2 2 1 3 3
9 3 2 1 2 1 3 4 2 4 4
我们可以分成任意数量的块:
square_mean(df.values, 2, 2)
array([[2.44, 2.4 ],
[2.4 , 2.48]])
square_mean(df.values, 5, 5)
array([[2.5 , 2.75, 3.25, 3.25, 1.75],
[2. , 1.75, 3. , 1. , 1.75],
[2.5 , 3. , 2. , 3. , 2.5 ],
[2. , 3.25, 1.75, 2.25, 3. ],
[3. , 1.75, 2. , 2.25, 3.5 ]])
推荐阅读
- python - 我将如何修改我的代码以避免此错误:PyQt: RuntimeError: Wrapped C/C++ object has been deleted
- sql - 根据另一个表中的值删除行
- javascript - 是否可以创建一个只有 2 个值的折线图?- Chart.js
- android - FCM 服务器端区分 iOS 和 Android
- regex - PowerShell 在特定字符串上滑动文本文件
- javascript - 如何使用 puppeteer 获取 oauth 访问令牌?
- javascript - 在 Three.js 中将 glTF 对象设置到不同层时遇到问题
- sql - T-SQL 改变字符串
- javascript - 如何获取路径未知的嵌套对象的值?
- ruby-on-rails - 如何从 Rails 应用程序连接到远程 mysql 服务器?