高级numpy数组乘法

2024-06-13 20:41:32 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑三个numpy数组。每个numpy数组都是三维的。我们有数组X,数组Y和数组Z。所有这些数组的形状都是一样的。将X、Y和Z的三个匹配元素在同一个位置组合起来就得到了一个坐标。我有一个函数(不是python函数,数学的),它必须在这些位置向量中的一个上运行,并将输出放入另一个名为s的三维数组中。因此,如果数组的定义如下所示:

X = [[[1,2],[3,4]]        Y = [[[1,2],[3,4]]      Z = [[[1,2],[3,4]]
     [[5,6],[7,8]]]            [[5,6],[7,8]]]          [[5,6],[7,8]]]

则测试点为:

^{pr2}$

如果函数s只是a+b+c,那么结果矩阵将是:

s=[[[ 3, 6],[ 9,12]]
   [[15,18],[21,24]]]

但事实并非如此,我们有一个名为sv的二维numpy数组。在实际问题中,sv是一个三维向量的列表,就像我们的位置向量一样。每个位置向量必须从每个支持向量中减去,并减去结果向量的大小,以给出每个向量的分类。什么numpy操作可以用来做到这一点?在


Tags: 函数numpy元素列表定义分类矩阵数学
1条回答
网友
1楼 · 发布于 2024-06-13 20:41:32

我们从3个组件数组开始xy,和{}。我将更改示例中的值,使它们具有唯一的值:

x = np.array([[[1,2],[3,4]],
              [[5,6],[7,8]]])
y = x + 10
z = y + 10

上面每一个都有(2,2,2)的形状,但它们可以是任何(n, m, l)。这种形状对我们的工艺影响不大。在

接下来,我们将三个组件数组组合成一个新的数组p,即“位置向量”,创建一个新的维度i,它将在三个物理维度上迭代x,y,z

^{pr2}$

所以p[0]x,依此类推,p具有形状{}(其中{}是向量的物理维度)。在

现在我们看看你的向量列表sv,它大概有(N, d)的形状。让我们用一个小数字来表示N

N = 4
d = 3
sv = np.arange(d*N).reshape(N,d) # a list of N vectors in 3d

好的,上面有点重复,但我想说清楚(请纠正我对你的问题可能产生的任何误解)。在

你想做些改变,diff,在这个过程中,你取了n*m*l中的每一个n*m*l向量,并从中减去{}中的N向量。这将给您N*n*m*l向量,每个向量都有d个组件。在做减法之前,我们需要将每个维度对齐。在

基本上我们想取p - sv,但是我们必须确保它们的形状匹配,这样d轴对齐,n, m, l和{}轴基本上是相加的。numpy广播的方式是获取数组的形状,并从末尾对齐它们,这样每个数组的最后一个轴对齐,依此类推。要广播,每个大小必须完全匹配,或者必须为空(在左侧)或1。也就是说,如果您的形状是(a, b, c)(b, c),那么就可以了,第二个数组将重复(“广播”)a次,以匹配第一个数组中形状(b, c)的不同子数组。您可以使用尺寸长度1,这将强制定位,因此通常形状(a, b, c)和{}的两个数组不会对齐,因为最后一个轴不匹配,但是您可以在第二个轴的末尾添加一个新的占位符轴,使其形状(a, b, 1),无论{}的值是多少,它都将与(a, b, c)匹配。在

我们将形状(N, d, 1, 1, 1)赋予sv,它与p(d, n, m, l)相匹配。这可以通过几种方式实现:

sv = sv.reshape(sv.shape + (1,1,1)])
#or
sv.shape += (1, 1, 1)
#or
sv = sv[..., None, None, None]

然后,我们可以做些不同的事情:

diff = p - sv[..., None, None, None]

其中{}是{}。现在我们可以将其平方,然后在第二个(d)维上求和,得到每个向量的范数/大小:

m = (diff*diff).sum(1)

当然,哪个形状是(N, n, m, l),或者在示例中是{}

所以,总而言之:

import numpy as np

x = np.array([[[1,2],[3,4]],
              [[5,6],[7,8]]])
y = x + 10
z = y + 10
p = np.array([x, y, z])
print p.shape
N = 4
d = 3
sv = np.arange(d*N).reshape(N,d) # a list of N vectors in 3d
print sv.shape
diff = p - sv[..., None, None, None]
print diff.shape
m = (diff*diff).sum(1)
print m.shape

相关问题 更多 >