我正在学习Numpy中的广播,在我正在读的书(Python for Data Analysis by Wes McKinney)中,作者提到了以下例子来“贬低”二维数组:
import numpy as np
arr = np.random.randn(4, 3)
print(arr.mean(0))
demeaned = arr - arr.mean(0)
print(demeaned)
print(demeand.mean(0))
这有效地导致数组demeaned
的平均值为0。你知道吗
我想把这个应用到一个像三维阵列的图像上:
import numpy as np
arr = np.random.randint(0, 256, (400,400,3))
demeaned = arr - arr.mean(2)
当然失败了,因为根据广播规则,尾随尺寸必须匹配,这里不是这样:
print(arr.shape) # (400, 400, 3)
print(arr.mean(2).shape) # (400, 400)
现在,我主要是通过从数组第三维度的每个索引中减去平均值来实现的:
demeaned = np.ones(arr.shape)
for i in range(3):
demeaned[...,i] = arr[...,i] - means
print(demeaned.mean(0))
此时,返回的值非常接近于零,我认为,这是一个精度错误。我的想法是对的还是我错过了另一个警告?你知道吗
而且,这并不是实现我想要实现的目标的最干净、最“numpy
”的方式。是否有一个函数或一个原则,我可以用来改进代码?你知道吗
从numpyversion1.7.0开始,^{} 和其他几个函数在其
axis
参数中接受一个元组。这意味着您可以一次对图像的所有平面执行操作:这个平均值将具有形状
(3,)
,图像的每个平面有一个元素。你知道吗如果要分别减去每个像素的平均值,则必须记住,广播将在右边缘对齐形状元组。这意味着您需要插入一个额外的维度:
或者
试试^{} 。你知道吗
输出:得到相同形状的数组,其中每个单元格都按所需的维度降级(第二个参数,这里是2)。你知道吗
相关问题 更多 >
编程相关推荐