我需要使用NumPy对大型数据集进行一些分析。
我有:
我需要能够获取特征值矩阵的每个元素 并乘以对应于特征向量的列。
因此,将数组1的第i个元素乘以数组2的第i列,依此类推所有i。
有什么想法吗? :/
答案 0 :(得分:1)
您可以使用numpy broadcasting rules:
执行此操作n = 4
A = np.random.randint(0, 10, size=(n,n))
B = np.array([1,0,2, 0])
B = B.reshape((1,n))
C = B * A
乘法在(1,n)和(n,n)矩阵之间。 为了满足广播规则,B矩阵将“扩展”为a(n,n) 在乘法之前的数组,然后像往常一样逐个元素地执行。
上面的乘法相当于
BB = np.array([[1,0,2, 0],
[1,0,2, 0],
[1,0,2, 0],
[1,0,2, 0]])
C = BB * A
但你永远不必在内存中构造矩阵BB
。
编辑:基准
由于使用对角矩阵似乎更容易阅读,因此我提供了以下快速基准,您可以自己尝试。
# Setup data
n = 50
A = np.random.normal(size=(n,n))
B = np.random.normal(size=n)
B1 = B.reshape(1, 3)
# Make sure results are the same
C = np.dot(A, np.diag(B))
C1 = B1 * A
print np.allclose(C, C1) # Should be 'True'
# Bench with IPython
>>> %timeit np.dot(A, np.diag(B))
The slowest run took 7.44 times longer than the fastest. This could mean that an intermediate result is being cached
10000 loops, best of 3: 36.7 µs per loop
>>> %timeit B1 * A
The slowest run took 10.27 times longer than the fastest. This could mean that an intermediate result is being cached
100000 loops, best of 3: 6.64 µs per loop
即。对于50x50矩阵,使用广播的速度是使用np.diag
和矩阵乘法的6倍。
答案 1 :(得分:1)
首先将1-dim特征值向量转换为对角矩阵。 然后,应用矩阵乘法。
import numpy as np
eigenval_diag = np.diag(eigenvalue_vec) # 50x50 matrix
result = eigenval_diag * eigen_matrix # 50x50 matrix