特殊向量和逐元素乘法

3
我有两个数组。一个是"A",长度任意(假设起始值为1000),每个点都拥有一个n维向量,其中每个条目表示一个标量。另一个是"B",有n个条目,每个条目都持有一个3维向量。如何进行标量乘法,使得结果是一个"C"数组,其中每个条目都是n个标量和n个3维向量的乘积?
以4-D为例:
    a=[[1,2,3,4],[5,6,7,8],....]
    b=[[1,0,0],[0,1,0],[0,0,1],[1,1,1]]

以及一个结果

    c=[[1*[1,0,0],2*[0,1,0],3*[0,0,1],4*[1,1,1]] , [5*[1,0,0],...],...]

实现应该使用numpy而不是太多的for循环,因为预计会有超过1000个条目。在我们的情况下,n预计为7。


2
请注意使用 numpy.arraylist 的区别,它们是不同的数据结构。例如,np.array([0,1,0]) * 2 的结果为 np.array([0,2,0]),而 [0,1,0] * 2 的结果为 [0,1,0,0,1,0] - Akavall
1个回答

3
如果您从以下内容开始:
a = np.array([[1,2,3,4],[5,6,7,8]])
b = np.array([[1,0,0],[0,1,0],[0,0,1],[1,1,1]])

然后我们可以在a上添加额外的轴,重复该数组沿着它的方向,就会得到...
>>> a[:,:,None].repeat(3, axis=2)
array([[[1, 1, 1],
        [2, 2, 2],
        [3, 3, 3],
        [4, 4, 4]],

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

现在,正如@Jaime所说,操作时不需要使用repeat,因为NumPy的广播会处理它:

>>> a[:,:,None] * b
array([[[1, 0, 0],
        [0, 2, 0],
        [0, 0, 3],
        [4, 4, 4]],

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

1
不需要使用repeat,广播会自动处理,比如a[..., None] * b可以让你得到同样的结果,并且更快。 - Jaime
是的...我只是用repeat来找出正确的轴添加,然后忘记删除它了。 - Ricardo Cárdenes
美观且易用...谢谢。我们尝试使用“repeat”来解决问题,但没有想到添加轴的简单方法。 - Dschoni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接