Arrays NumPy:用三维数组中的平均值替换沿三维方向的所有元素
我有一个尺寸为400*800*3的3D阵列。我想用第三维度的平均值替换第三维度中的所有元素。现在,我已经能够通过使用循环来实现这一点Arrays NumPy:用三维数组中的平均值替换沿三维方向的所有元素,arrays,python-3.x,numpy,Arrays,Python 3.x,Numpy,我有一个尺寸为400*800*3的3D阵列。我想用第三维度的平均值替换第三维度中的所有元素。现在,我已经能够通过使用循环来实现这一点 test_data=np.random.randint(0,256,size=(400,800,3)) for i in range(400): for j in range(800): mn = np.mean(test_data[i,j]) test_data[i,j]=mn 我想知道是否有一种更有效、更简洁的方法来实
test_data=np.random.randint(0,256,size=(400,800,3))
for i in range(400):
for j in range(800):
mn = np.mean(test_data[i,j])
test_data[i,j]=mn
我想知道是否有一种更有效、更简洁的方法来实现同样的目标。谢谢
另外,如果不是平均值,而是三个元素的加权平均值,即最后一行应替换为
test_data[i,j,0]=test_data[i,j,0]*0.2
test_data[i,j,1]=test_data[i,j,1]*0.5
test_data[i,j,2]=test_data[i,j,2]*0.3
获取沿最后一个轴的平均值,并使用
[:]
-
test_data[:] = test_data.mean(axis=-1,keepdims=1)
或者,我们可以创建一个沿最后一个轴复制的新阵列-
mean_vals = test_data.mean(axis=-1,keepdims=1).astype(test_data.dtype)
test_data_out = np.repeat(mean_vals,3,axis=-1)
对于只读版本和更快的方式,请使用np.broadcast\u to
-
test_data_out = np.broadcast_to(mean_vals, test_data.shape)
对于加权平均部分,如果您的意思是:
test_data[i,j]= test_data[i,j,0]*0.2 + test_data[i,j,1]*0.5 + test_data[i,j,2]*0.3
test_data[i,j,0]=test_data[i,j,0]*0.2
test_data[i,j,1]=test_data[i,j,1]*0.5
test_data[i,j,2]=test_data[i,j,2]*0.3
为此,我们可以使用多维张量约化:-
相反,如果你的意思是:
test_data[i,j]= test_data[i,j,0]*0.2 + test_data[i,j,1]*0.5 + test_data[i,j,2]*0.3
test_data[i,j,0]=test_data[i,j,0]*0.2
test_data[i,j,1]=test_data[i,j,1]*0.5
test_data[i,j,2]=test_data[i,j,2]*0.3
因此,没有总和缩减
,因此我们可以简单地利用广播
-
test_data[:] = (test_data*[0.2, 0.5, 0.3]).astype(test_data.dtype)
这应该起作用:
test_data[:,:,0] += test_data[:,:,1]
test_data[:,:,0] += test_data[:,:,2]
test_data[:,:,0] *= 1.0/3
test_data[:,:,1] = test_data[:,:,0]*0.5
test_data[:,:,2] = test_data[:,:,0]*0.3
test_data[:,:,0] *= 0.2
这种方法将在不需要额外内存的情况下“就地”工作
In [556]: test_data=np.arange(24.).reshape(2,4,3)
In [557]: test_data
Out[557]:
array([[[ 0., 1., 2.],
[ 3., 4., 5.],
[ 6., 7., 8.],
[ 9., 10., 11.]],
[[ 12., 13., 14.],
[ 15., 16., 17.],
[ 18., 19., 20.],
[ 21., 22., 23.]]])
沿最后一个维度缩放值只是一个乘法:
In [558]: test_data*np.array([0.2, 0.5, 0.3])
Out[558]:
array([[[ 0. , 0.5, 0.6],
[ 0.6, 2. , 1.5],
[ 1.2, 3.5, 2.4],
[ 1.8, 5. , 3.3]],
[[ 2.4, 6.5, 4.2],
[ 3. , 8. , 5.1],
[ 3.6, 9.5, 6. ],
[ 4.2, 11. , 6.9]]])
可以使用test\u data*=np.array([..])
最后一个维度的平均值为:
In [559]: test_data.mean(axis=-1)
Out[559]:
array([[ 1., 4., 7., 10.],
[ 13., 16., 19., 22.]])
这是2d@divakar展示了如何保持3d(保持dims
)甚至全尺寸(2,4,1)甚至(2,4,3)
np.average
用于指定权重(加权平均):
这与在最后一个维度上取点积相同
In [569]: np.dot(test_data, [0.2,0.5,0.3])
Out[569]:
array([[ 1.1, 4.1, 7.1, 10.1],
[ 13.1, 16.1, 19.1, 22.1]])
In [569]: np.dot(test_data, [0.2,0.5,0.3])
Out[569]:
array([[ 1.1, 4.1, 7.1, 10.1],
[ 13.1, 16.1, 19.1, 22.1]])