Python 有没有一种方法可以让这段代码更加通用和优雅?
我是一个Python新手,我想问一下,是否有一种方法可以让这段代码更加优雅和通用:Python 有没有一种方法可以让这段代码更加通用和优雅?,python,numpy,Python,Numpy,我是一个Python新手,我想问一下,是否有一种方法可以让这段代码更加优雅和通用: array = np.linalg.norm(np.array([ X-mu[0], X-mu[1], X-mu[2], X-mu[3], X-mu[4], ]), axis=2) X是RGB图像(NxD,30000x3阵列),mu是kxD(5x3)矩阵。最终,数组应该是kxN或Nxk矩阵 有没有一种方法可以循环使用mu的索引而不是手动键入它?您正在尝试对(3k,3)和(5,3)数
array = np.linalg.norm(np.array([
X-mu[0],
X-mu[1],
X-mu[2],
X-mu[3],
X-mu[4],
]), axis=2)
X是RGB图像(NxD,30000x3阵列),mu是kxD(5x3)矩阵。最终,数组应该是kxN或Nxk矩阵
有没有一种方法可以循环使用mu的索引而不是手动键入它?您正在尝试对
(3k,3)
和(5,3)
数组执行减法操作。为了能够减少第二个轴以获得(3k,5)
或(5,3k)
的最终结果,您需要将第一个维度一起广播。如果引入一个新的轴,这对于广播来说是微不足道的:
np.linalg.norm(X[:, None, :] - mu[None, ...], axis=-1)
或
None
在下标中放置的位置创建大小为1的新轴。省略号(…
)抓住其余的轴,这样您就不必显式地编写:,:
上述表达式的差异分别传播到
(3k,5,3)
和(5,3k,3)
。在这两种情况下,norm
缩小最后一个轴,保留形状的前两个元素。根据您的内存布局,这两种方法都可能更快,有时甚至更明显。如果这对您很重要,那么做一个基准测试可能是值得的。什么尺寸是X
?X是一个NxD(约300.000x3数组)您希望输出的尺寸是多少?等等,X是2D还是3D?刚刚更新了说明。X是2D。
np.linalg.norm(X[None, ...] - mu[:, None, :], axis=-1)