【问题标题】:Special Vector and Element-wise Multiplication特殊向量和元素乘法
【发布时间】:2014-03-03 12:43:57
【问题描述】:

我有 2 个数组。 “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。

【问题讨论】:

  • 请注意numpy.arraylist的使用。这些是不同的数据结构。例如np.array([0,1,0]) * 2 的结果是np.array([0,2,0]),而[0,1,0] * 2 的结果是[0,1,0,0,1,0]

标签: python arrays numpy


【解决方案1】:

如果你开始:

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

【讨论】:

  • 您不需要repeat,广播会处理它,即a[..., None] * b 与您一样,只是更快。
  • 是的...我使用repeat 只是为了找出要添加的右轴,却忘记删除它。
  • 美丽而简单...谢谢。我们尝试使用repeat 解决问题,但没有想到添加轴的简单想法。
猜你喜欢
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多