numpy数组和矩阵乘法

时间:2018-10-16 19:56:11

标签: python arrays numpy matrix multiplication

我正在尝试摆脱for循环,而是在geom_jitter()数组很大的情况下进行数组矩阵乘法以减少处理时间:

ggplot(data = dt, aes(x=Effort, y=hairchange, color  = CombinedHair))+geom_jitter(width = 0.1, height = 0.1)

位置:

weightsimport numpy as np sequence = [np.random.random(10), np.random.random(10), np.random.random(10)] weights = np.array([[0.1,0.3,0.6],[0.5,0.2,0.3],[0.1,0.8,0.1]]) Cov_matrix = np.matrix(np.cov(sequence)) results = [] for w in weights: result = np.matrix(w)*Cov_matrix*np.matrix(w).T results.append(result.A) 矩阵
Cov_matrix是长度为3x3的数组,其中包含weights n个矩阵。

是否可以将n乘以/映射到1x3并绕过for循环?我对所有的numpy函数不是很熟悉。

2 个答案:

答案 0 :(得分:1)

通过将权重作为矩阵,然后查看结果的对角元素,可以实现相同的目的。即:

np.diag(weights.dot(Cov_matrix).dot(weights.transpose()))

给出:

array([0.03553664, 0.02394509, 0.03765553])

这将进行不必要的计算(计算非对角线),因此也许有人会建议一种更有效的方法。

注意:我建议您慢慢远离np.matrix,而改用np.array。习惯于不能A*b会花费一些时间,但从长远来看会带来好处。 Here是相关的讨论。

答案 1 :(得分:1)

我想重申在另一个答案中已经说过的话:np.matrix类如今的弊端多于优势,我建议仅使用np.array类。可以使用@运算符轻松地编写数组的矩阵乘法,因此在大多数情况下,这种表示法与matrix类一样优雅(并且数组没有矩阵所具有的几个限制)。 / p>

这样一来,您就可以通过调用np.einsum来完成所需的工作。我们需要收缩三个矩阵的某些索引,同时在两个矩阵中单独保留一个索引。也就是说,我们要对w_{ij} * Cov_{jk} * w.T_{ki}j求和来执行k,从而给我们一个包含i索引的数组。对einsum的以下调用将完成:

res = np.einsum('ij,jk,ik->i', weights, Cov_matrix, weights)

请注意,以上内容将为您提供一个1d数组,而您最初只有一个形状为(1,1)的数组列表。我怀疑以上结果将更有意义。另外,请注意,我在第二个weights参数中省略了转置,这就是为什么相应的总和索引显示为ik而不是ki的原因。这应该快一点。

为证明以上给出的结果相同:

In [8]: results # original
Out[8]: [array([[0.02803215]]), array([[0.02280609]]), array([[0.0318784]])]

In [9]: res # einsum
Out[9]: array([0.02803215, 0.02280609, 0.0318784 ])