gpt4 book ai didi

arrays - NumPy:用三维数组中的平均值替换第三维的所有元素

转载 作者:行者123 更新时间:2023-12-03 16:31:59 25 4
gpt4 key购买 nike

我有一个尺寸为 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[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_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

为此,我们可以使用多维张量缩减:np.tensordot -

W = [0.2,0.5,0.3] # weights
W_mean = np.tensordot(test_data,W, axes=((-1,-1)))[...,None]
test_data[:] = W_mean.astype(test_data.dtype)

相反,如果你的意思是:

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

为此,没有sum-reduction,所以我们可以简单地使用广播 -

test_data[:] = (test_data*[0.2, 0.5, 0.3]).astype(test_data.dtype)

关于arrays - NumPy:用三维数组中的平均值替换第三维的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46372880/

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