python - python 高级 numpy array 乘法

  显示原文与译文双语对照的内容

考虑三个numpy数组。每个 numpy array 都是三维的。 我们有 array X,array Y 和 array Z 。 所有这些阵列都是相同的形状。 将X 。Y 和Z的三个匹配元素组合在一起给出一个坐标。 我有一个函数( 。非 python 函数,数学),它必须运行在这些位置向量之一,并将输出放在另一个三维 array 。 因此,如果数组定义如下所示:


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]]]



然后要测试的点是:


(1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8)



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


s=[[[ 3, 6],[ 9,12]]


 [[15,18],[21,24]]]



但实际上,我们有一个名为 sv的二维 numpy array 。 实际问题中,sv 是维度three向量的列表,就像我们的位置向量。 每个位向量必须从每个支撑向量减去 ,得到得到的向量的大小,以便给每个向量的分类提供分类。 numpy操作可以用来做什么?

时间: 原作者:

我们从 xyz的3数组开始。 我将更改示例中的值,以便它们具有唯一的值:


x = np.array([[[1,2],[3,4]],


 [[5,6],[7,8]]])


y = x + 10


z = y + 10



上面的每个都有形状 (2,2,2),但是它们可以是任何 (n, m, l) 。 这个形状对我们的过程影响很小。

接下来我们将这三个组件数组组合成一个新的array p,"位置矢量",创建一个新维度 i,将遍历三个物理维度 x 。y 。z 。


p = np.array([x, y, z])



所以 p[0]x,而 p 有形状 (d, n, m, l) ( d=3 是向量的物理维度) 。

现在我们看看你的向量 sv 列表,它可以能是形状 (N, d) 。 让我们为 N 使用一个小的数字:


N = 4


d = 3


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



好的,上面是一个小 repetive,但我想清楚的说,( 请纠正我从你的问题中得到的任何误解) 。

你想要做一些差别,diff 中的每一个 n*m*l 向量都被隐藏在 p 中,并且每个 N 向量都从 sv 中减去。 这将给你 N*n*m*l 向量,每个向量都有 d 。 我们需要先对这些维度进行对齐,然后再减少。

基本上我们要取 p - sv,但是我们必须确保它们的形状是 MATCH,所以 d 轴是对齐的,而 n, m, lN 轴基本上是加起来。 ccr广播的方式是获取 array的形状,从末尾对齐它们,所以每个最后一个轴都对齐,等等。 要播放,每个大小必须确定为 MATCH,或者必须是空的( 左边) 或者 1 。 也就是说,如果形状是 (a, b, c)(b, c),那么就可以了,第二个 array 将在第2 个 array 中将第2 个形状 (b, c)的第2 个子类重新广播到。 你可以使用尺寸长度 1 来强制位置,所以通常两个形状数组和 (a, b) 不会对齐,因为在第二个轴上,你可以在第二个轴上添加一个新的占位符,而不管 c 值是什么。

我们给形状 (N, d, 1, 1, 1)sv的MATCHES (d, n, m, l)p 可以通过以下几种方式进行:


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]



我们有 diff.shape的位置 (N, d, n, m, l) 现在,我们可以对它和第二个( d ) 维数进行求和,以获得每个向量的规范/大小:


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



当然会有形状 (N, n, m, l) ,或者在示例案例中 (4, 2, 2, 2)

所以,全部都是:


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



原作者:
...