【问题标题】:Vectorization of matrix creation by difference of vectors (e.g. for numpy)通过向量的差异对矩阵创建进行向量化(例如,对于 numpy)
【发布时间】:2020-07-16 08:39:59
【问题描述】:

我经常需要根据给定的向量v[i] 计算一个矩阵A[i,j] by:

A[i, j] = v[j] - v[i]

这在嵌套循环中很简单,但我想对其进行矢量化。到目前为止,我只提出了另外创建两个矩阵的相当丑陋的解决方案,其中 v 在每一行/列中重复,因此我可以使用简单的元素矩阵加法。

这里是一个 numpy 的例子:

import numpy as np
length = 10
v = np.random.random(length)
vjMatrix = np.broadcast_to(v, (length, length))
viMatrix = np.transpose(vjMatrix)

A = vjMatrix - viMatrix
print(A)

但是,我希望有一个更优雅的解决方案,我只是看不到。查了很多帖子,没有找到特别合适的。

谢谢!

【问题讨论】:

  • 能否请你用一些值和所需的输出填充你的向量?
  • 编辑了向量中的随机值,纠正了小错误并添加了所需矩阵的输出。

标签: python arrays numpy vectorization


【解决方案1】:

如果我正确理解你的问题,你目前填写数组A 喜欢:

import numpy as np

length = 100
np.random.seed(123)
v = np.random.rand(length)

vjMatrix = np.broadcast_to(v, (length, length))
viMatrix = np.transpose(vjMatrix)

A = vjMatrix - viMatrix

如果这是您想要的,您可以通过广播矢量 v 来替换循环和显式创建 v-矩阵:

A_new = v - v[:, None]
print(np.all(A == A_new))
# Out: True

【讨论】:

  • 谢谢!您有关于该广播符号的推荐阅读源吗?我不太明白 [:,None] - 部分的作用。
  • @NegativeJacobian 只需使用 [:,None] 为 v 添加一个新维度(使其成为二维),然后让 numpy 广播来处理。
  • 不客气!是的,看看numpy broadcasting documentation[:, None][:, np.newaxis] 一样,都是创建一个新的轴(放大维数),从而可以灵活操作。
  • 非常感谢!最后一个额外的 - 可能是愚蠢的 - 问题:由于这使用了 numpy 广播功能,因此可能不会有类似的解决方案,例如在 c++ 中使用 std:vectors 或其他矩阵库,除非它们实现了类似的东西,对吧?
  • 好问题,老实说不知道...自从我使用 c++ 以来已经很长时间了。但如果我没记错的话,也有类似的东西。我想这是在 stackoverflow 上提出一个新问题的好理由。 :)
猜你喜欢
  • 2015-04-16
  • 1970-01-01
  • 2016-01-16
  • 2019-11-07
  • 2012-06-17
  • 2023-01-11
  • 1970-01-01
  • 2020-11-22
  • 2013-05-30
相关资源
最近更新 更多