我转换了以下函数
def quaternion_multiply(quaternion0, quaternion1):
"""Return multiplication of two quaternions.
>>> q = quaternion_multiply([1, -2, 3, 4], [-5, 6, 7, 8])
>>> numpy.allclose(q, [-44, -14, 48, 28])
True
"""
x0, y0, z0, w0 = quaternion0
x1, y1, z1, w1 = quaternion1
return numpy.array((
x1*w0 + y1*z0 - z1*y0 + w1*x0,
-x1*z0 + y1*w0 + z1*x0 + w1*y0,
x1*y0 - y1*x0 + z1*w0 + w1*z0,
-x1*x0 - y1*y0 - z1*z0 + w1*w0), dtype=numpy.float64)
到批处理版本
^{pr2}$此函数用于处理形状为(?)的四元数1和四元数0?,4)。现在我希望函数可以处理任意数量的维,比如(?)?,?,4)。怎么做?在
只需将
axis-=-1
传递给np.split
沿最后一个轴拆分,就可以得到您所追求的行为。在由于数组有一个恼人的大小为1的尾随维度,而不是沿着一个新维度堆叠,然后将其压缩,您可以简单地将它们连接起来,同样沿着(最后一个)
axis=-1
:请注意,使用此方法,不仅可以乘法任意维数的形状相同的四元数堆栈:
^{pr2}$但是,你也可以得到很好的广播,也就是说,你可以用一个四元数乘以一堆四元数,而不必调整维数:
或者在一条直线上尽可能少地摆弄两个堆栈之间的所有交叉积:
你快到了!您只需对如何拆分和连接阵列稍微小心一点:
在这里,我们两次使用
^{pr2}$axis=-1
沿最后一个轴拆分,然后沿最后一个轴连接回来。最后,我们挤出倒数第二个轴,正如您正确注意到的。为了证明它的有效性:希望这就是你需要的!这应该适用于任意维度和任意数量的维度。在
注意:
np.split
似乎不适用于列表。所以你只能把数组传递给你的新函数,就像我上面所做的那样。如果您想传递列表,您可以改为调用在你的功能内。在
而且,您的测试用例似乎是错误的。我想您已经交换了}的位置:我在测试
quaternion0
和{q0
和q1
时,把它们交换回来了。在您可以使用^{} 将最后一个轴放在前面,帮助我们在不实际拆分4个数组的情况下将它们切片。我们执行所需的操作,最后将第一个轴发送回末尾,以保持输出数组形状与输入相同。因此,我们将有一个解决一般的n维n维nArray,如-
样本运行-
^{pr2}$相关问题 更多 >
编程相关推荐