使用Numpy转置的轴排列产生了意想不到的结果

0vvn1miw  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(117)

耶洛
以下是我对np.transpose(arr, perm_pos)的理解:
假设我们想要将3D np.ndarray的轴移动到转置ndarray中的特定位置,我们本质上将perm_pos指定为目标轴索引。例如:

a = np.arange(100).reshape((2, 10, 5))
target_shape = (5, 2, 10)
print(f"Explicit shape transform: {a.transpose((1, 2, 0)).shape}")  # prints the target shape as above.

字符串
到目前为止一切顺利!
现在考虑以下示例:

# bigger example 
b = np.arange(239400).reshape((126, 380, 5))
target_shape_ = (5, 126, 380)
print(f"Explicit shape transform: {b.transpose((1, 2, 0)).shape}")  # prints  a different shape from the desired target_shape


为什么会出问题?
我知道我可以简单地使用np.moveaxis函数通过np.moveaxis(b,-1,0)将axis 3带到0的位置,但这不是我想做的事情。这里发生了什么?
干杯!干杯!

已编辑

很抱歉误解了函数参数。是的,上面的代码确实没有产生所需的目标形状。将perm_pos设置为(2, 0, 1)将产生所需的target_shape。

mutmk8jj

mutmk8jj1#

当我这样做的时候,我在两种情况下都没有得到指定的顺序。相反,我得到了(10,5,2)和(380,5,126)。如果你在两种情况下都把(1,2,0)改为(2,0,1),它会像预期的那样工作,所以在小例子和大例子之间没有区别。

83qze16e

83qze16e2#

让我清楚地解释如何计算置换参数:在你的例子中,你想把一个大小为(a,B,c)的数组转置为(a,c,B)。要计算置换参数,首先你必须对每个轴进行Python编号,所以在给定的例子中:“a”是axis=0,“B”是axis =1,“c”是axis=2。然后,您应该保持原始轴编号,并将这些编号排列成最终所需的轴排列,如:a应该放在axis=1上,“a”由数字0表示,所以0位于axis=1的位置,这给出了=>(?,0,?),并且通过对其他轴保持相同的条件,将获得(2,0,1)的置换变元。然而,在计算置换变元时,很容易将最终轴数误认为是原始轴数,例如错误地考虑:“a”应该变成axis=1,“b”应该变成axis=2,而“c”应该变成axis=0,这给出了错误的值(1,2,0)。在某些情况下,即使你选择了第二种方法(错误的)如果排列变化是对称的,从中轴线的Angular 来看,(在3维中,它是轴=1,但例如在4维中,它是轴=1和轴=2之间的假想轴),例如,如果你想将(a,b,c)整形为(c,b,a),这两种方法都产生(2,1,0)的置换参数。所以,很容易认为你的错误方法是正确的,并想知道为什么它不适用于某些特定的整形!

相关问题