Python 用中位数沿特定轴填充三维numpy数组
假设我有以下numpy数组arr:Python 用中位数沿特定轴填充三维numpy数组,python,arrays,numpy,padding,Python,Arrays,Numpy,Padding,假设我有以下numpy数组arr: [[0] [ 1 10] [ 2 20]] [[ 3 30] [ 4 40] [ 5 50]] [[ 6 60] [ 7 70] [ 8 80]] [[ 9 90] [ 10 100] [ 11 110]] [[ 12 120] [ 13 130] [ 14 140]]] 形状(5,3,2) 现在,注意arr的以下尺寸: 第一个'arr[:,:,0] [[0 1 2] [ 3 4 5] [ 6 7 8] [ 9 1
[[0]
[ 1 10]
[ 2 20]]
[[ 3 30]
[ 4 40]
[ 5 50]]
[[ 6 60]
[ 7 70]
[ 8 80]]
[[ 9 90]
[ 10 100]
[ 11 110]]
[[ 12 120]
[ 13 130]
[ 14 140]]]
形状(5,3,2)
现在,注意arr的以下尺寸:
第一个'arr[:,:,0]
[[0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]
[12 13 14]]
中位数7
和'arr[:,:,1]
[[0 10 20]
[ 30 40 50]
[ 60 70 80]
[ 90 100 110]
[120 130 140]]
中位数为70
我想在arr
的第一个轴上加上上面的一对中间点(可以计算为np.median(a.reformate(-1,a.shape[-1]),axis=0)
),这样,对于一些k>5,结果具有shape(k,3,2)
,并且填充为以下内容(例如k=2
,以及最终形状(7,3,2)
[[0]
[ 1 10]
[ 2 20]]
[[ 3 30]
[ 4 40]
[ 5 50]]
[[ 6 60]
[ 7 70]
[ 8 80]]
[[ 9 90]
[ 10 100]
[ 11 110]]
[[ 12 120]
[ 13 130]
[ 14 140]]
[[ 7 70]
[ 7 70]
[ 7 70]]
[[ 7 70]
[ 7 70]
[ 7 70]]]
请注意,我不能使用numpy.pad
的mode='median'
参数,因为它没有选择只考虑阵列的一个轴并展平其他轴来计算中位数(如果我固定某个轴,它将始终跨其他轴计算单个中位数)
问题是,在numpy 2.16中,我曾经能够以一种非常简单的方式实现这一点:
md=np.中位数(a.重塑(-1,a.形状[-1]),轴=0)
arp=np.pad(a,((0,k),(0,0),(0,0)),mode='constant',constant_值=(0,md))
但是numpy 2.19中出现了相同的代码中断,错误如下:
ValueError: could not broadcast input array from shape (2) into shape (7,3,0)
使用numpy.pad
,我尝试了大量的输入变体,但运气不好。这真的让我发疯了,在这一点上,我几乎只是在叠加中间数组的重复。但是我真的很想知道,在numpy 2.19中使用numpy.pad是否有可能解决这个问题:
#(可复制设置)
a=np.arange(15)。重塑(5,3,1)
a=np.连接((a,a*10),轴=-1)
#沿轴0,1的中线
md=np.中值(a,轴=(0,1))
#用中位数“填充”
k=2
b=np.vstack((a,np.tile(md,(k,a.shape[1],1)))
>b
数组([[0,0.],
[ 1., 10.],
[ 2., 20.]],
[[ 3., 30.],
[ 4., 40.],
[ 5., 50.]],
[[ 6., 60.],
[ 7., 70.],
[ 8., 80.]],
[[ 9., 90.],
[ 10., 100.],
[ 11., 110.]],
[[ 12., 120.],
[ 13., 130.],
[ 14., 140.]],
[[ 7., 70.],
[ 7., 70.],
[ 7., 70.]],
[[ 7., 70.],
[ 7., 70.],
[ 7., 70.]]])
编辑:如果要使用键盘
,也可以执行以下操作:
b=np.pad(
a、 重塑((-1,2)),
((0,k*a.shape[1]),(0,0)),
模式=中间值',
).重塑(np.添加(a.形状,(k,0,0)))
这让你可以使用你一直在寻找的mode='media'
,这种方式对pad()来说是很自然的,这确实有效,但这并不完全是我想要的,因为我想知道在numpy 2.19中使用numpy.pad
是否有可能解决这个问题(因为我实际上是在numpy 2.16中解决的)尽管如此,我仍在向上投票,因为我忽略了一个事实,即可以计算轴列表旁边的中位数,如md=np。中位数(a,轴=(0,1))
,这是非常有趣的信息!好的,请参阅附录使用pad。