通过向量的差异对矩阵创建进行向量化(例如,对于 numpy)
Vectorization of matrix creation by difference of vectors (e.g. for numpy)
我经常需要根据给定的向量 v[i]
计算矩阵 A[i,j]
,方法是:
A[i, j] = v[j] - v[i]
这在嵌套循环中很简单,但我想对其进行矢量化。到目前为止,我只想出了一个相当难看的解决方案,即另外创建两个矩阵,其中 v 在每个 row/column 中重复,因此我可以使用简单的逐元素矩阵加法。
这里有一个 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)
不过,我希望有一个更优雅的解决方案,只是我没有看到。翻了很多帖,没找到特别合适的。
谢谢!
如果我没听错你的问题,你目前填写的数组 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
我经常需要根据给定的向量 v[i]
计算矩阵 A[i,j]
,方法是:
A[i, j] = v[j] - v[i]
这在嵌套循环中很简单,但我想对其进行矢量化。到目前为止,我只想出了一个相当难看的解决方案,即另外创建两个矩阵,其中 v 在每个 row/column 中重复,因此我可以使用简单的逐元素矩阵加法。
这里有一个 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)
不过,我希望有一个更优雅的解决方案,只是我没有看到。翻了很多帖,没找到特别合适的。
谢谢!
如果我没听错你的问题,你目前填写的数组 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