在 python 2.7 (numpy) 中是否可以在没有循环的情况下进行这些矩阵运算?
Is it possible to make these matrix operations without loops in python 2.7 (numpy)?
我想在 Python 中使用矩阵实现下面的循环:
import numpy as np
n = 5 # samples
k = 2 # inputs
m = 3 # gaussians
# X is nxk
X = np.array([[0.0, 10.0], [20.0, 30.0],[40, 50],[60,70],[80,90]])
#locations is mxk
locations = np.array([[0.01, 0.02], [0.03,0.04], [0.05, 0.06]])
dev = np.empty([n,k,m])
for samples in range(n):
for inputs in range(k):
for gaussians in range(m):
dev[samples,inputs,gaussians]=X[samples,inputs]-locations[gaussians,inputs]
output = np.empty([n,m])
for samples in range(n):
for gaussians in range(m):
output[samples,gaussians]=np.sum(dev[samples,:,gaussians]*dev[samples,:,gaussians])
我知道 Numpy 可以使用不同维度的数组 (Broadcast) 进行运算,但我不能在这里使用这个概念。请注意,我基本上是在删除向量样本的平均值并计算其平方范数。
您可以像这样矢量化您的 for 循环; dev
基本上是 X
和 locations
相对于第一个维度的外部操作,因此您可以在 locations
(或 X
,这只会影响你将如何转置结果)并且减法将触发 numpy 广播并返回 cartesian/outer 减法;对于第二个,您需要将 dev
与自身相乘,并沿第二个维度(轴 = 1)乘以 sum
:
mydev = np.transpose(X - locations[:,None], (1,2,0))
(mydev == dev).all()
# True
myoutput = (mydev**2).sum(axis=1)
(myoutput == output).all()
# True
或放在一起:
((X[:,None] - locations) ** 2).sum(axis=-1)
#array([[ 99.6005, 99.2025, 98.8061],
# [ 1298.4005, 1296.4025, 1294.4061],
# [ 4097.2005, 4093.6025, 4090.0061],
# [ 8496.0005, 8490.8025, 8485.6061],
# [ 14494.8005, 14488.0025, 14481.2061]])
我想在 Python 中使用矩阵实现下面的循环:
import numpy as np
n = 5 # samples
k = 2 # inputs
m = 3 # gaussians
# X is nxk
X = np.array([[0.0, 10.0], [20.0, 30.0],[40, 50],[60,70],[80,90]])
#locations is mxk
locations = np.array([[0.01, 0.02], [0.03,0.04], [0.05, 0.06]])
dev = np.empty([n,k,m])
for samples in range(n):
for inputs in range(k):
for gaussians in range(m):
dev[samples,inputs,gaussians]=X[samples,inputs]-locations[gaussians,inputs]
output = np.empty([n,m])
for samples in range(n):
for gaussians in range(m):
output[samples,gaussians]=np.sum(dev[samples,:,gaussians]*dev[samples,:,gaussians])
我知道 Numpy 可以使用不同维度的数组 (Broadcast) 进行运算,但我不能在这里使用这个概念。请注意,我基本上是在删除向量样本的平均值并计算其平方范数。
您可以像这样矢量化您的 for 循环; dev
基本上是 X
和 locations
相对于第一个维度的外部操作,因此您可以在 locations
(或 X
,这只会影响你将如何转置结果)并且减法将触发 numpy 广播并返回 cartesian/outer 减法;对于第二个,您需要将 dev
与自身相乘,并沿第二个维度(轴 = 1)乘以 sum
:
mydev = np.transpose(X - locations[:,None], (1,2,0))
(mydev == dev).all()
# True
myoutput = (mydev**2).sum(axis=1)
(myoutput == output).all()
# True
或放在一起:
((X[:,None] - locations) ** 2).sum(axis=-1)
#array([[ 99.6005, 99.2025, 98.8061],
# [ 1298.4005, 1296.4025, 1294.4061],
# [ 4097.2005, 4093.6025, 4090.0061],
# [ 8496.0005, 8490.8025, 8485.6061],
# [ 14494.8005, 14488.0025, 14481.2061]])