Python:如何将一个数组中的元素与列/行相乘

时间:2016-02-26 07:50:11

标签: python numpy

我需要使用NumPy对大型数据集进行一些分析。

我有:

  1. 一个50X1矩阵(特征值)
  2. 一个50x50矩阵(特征向量)
  3. 我需要能够获取特征值矩阵的每个元素 并乘以对应于特征向量的列。

    因此,将数组1的第i个元素乘以数组2的第i列,依此类推所有i。

    有什么想法吗? :/

2 个答案:

答案 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