我正在尝试摆脱for循环,而是在geom_jitter()
数组很大的情况下进行数组矩阵乘法以减少处理时间:
ggplot(data = dt, aes(x=Effort, y=hairchange, color = CombinedHair))+geom_jitter(width = 0.1, height = 0.1)
位置:
weights
是import 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函数不是很熟悉。
答案 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 ])