Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找数据帧中相邻元素(行和列)的平均值_Python_Pandas_Dataframe - Fatal编程技术网

Python 查找数据帧中相邻元素(行和列)的平均值

Python 查找数据帧中相邻元素(行和列)的平均值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一张图像,我根据它的像素强度创建了一个数据帧。由此,我想创建一个网格,在其中我可以找到网格中每个正方形的平均强度,用2x2像素表示。这样做是为了捕获更大的强度区域,以便将其与背景噪声区分开来。(为了提供上下文,我认为最好包括这一点。) 在DataFrame中,这将转化为从一组2个相邻行和列中查找4个值的平均值 为了说明问题,假设我们有以下数据帧: df=pd.DataFrame({'A':(np.linspace(1,4,num=4)),'B':(np.linspace(5,8,num=4)

我有一张图像,我根据它的像素强度创建了一个数据帧。由此,我想创建一个网格,在其中我可以找到网格中每个正方形的平均强度,用2x2像素表示。这样做是为了捕获更大的强度区域,以便将其与背景噪声区分开来。(为了提供上下文,我认为最好包括这一点。)

在DataFrame中,这将转化为从一组2个相邻行和列中查找4个值的平均值

为了说明问题,假设我们有以下数据帧:

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))})
由此,我们想要创建一个对应于每个平方的平均值的数据帧。在这种情况下,它将对应于以下值(例如,3是2x2平方的平均值,值为(1,5,2,6),11.5是(9,13,10,14)的平均值):

如果问题仍然不清楚,想象一下,取原始数据框,在中间画一条垂直线和一条水平线。这将产生4个框。在4个框中的每个框中,您将找到4个值。我想计算每个框的平均值,并将其插入到由框的平均值组成的新数据框中

PS:不幸的是,我还不知道如何显示数据帧本身,而不仅仅是代码。打印功能不起作用。我希望这不会太麻烦


非常感谢!

使用底层的
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))


此解决方案之所以有效,完全是因为对阵列进行了一些巧妙的重塑,以下是重塑的工作原理:

yy, xx = arr.shape
vals = arr.reshape(2, yy//2, 2, xx//2)
print(vals)

正如您所看到的,数组已被重塑为块,然后我们可以使用这些块来计算平均值


此解决方案将扩展到所有输入大小,只需选择
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)


只需在基础numpy数组上使用卷积:

import scipy.ndimage
full_conv = scipy.ndimage.filters.convolve(df.values, 0.25*np.ones((2,2)))
strided_conv = full_conv[::2, ::2]
结果:

array([[ 3.5, 11.5],
       [ 5.5, 13.5]])

这是一个非常聪明的解决方案,我在第二行得到了一个
数据类型不可理解的错误
,似乎与您给convolution@user3483203哎呀。当我简化代码时,不小心删除了一些括号。修复了它,谢谢!
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 ]])
import scipy.ndimage
full_conv = scipy.ndimage.filters.convolve(df.values, 0.25*np.ones((2,2)))
strided_conv = full_conv[::2, ::2]
array([[ 3.5, 11.5],
       [ 5.5, 13.5]])