2017-08-30 48 views
0

我有两个np.matrixes,其中一个我试图规范化。我知道,一般来说,列表推导比循环更快,所以我试图将我的double for循环转换为列表表达式。np矩阵的列表理解

# normalize the rows and columns of A by B 
for i in range(1,q+1): 
    for j in range(1,q+1): 
     A[i-1,j-1] = A[i-1,j-1]/(B[i-1]/B[j-1]) 

这是我迄今为止得到:

A = np.asarray([A/(B[i-1]/B[j-1]) for i, j in zip(range(1,q+1), range(1,q+1))]) 

,但我想我采取错误的做法,因为我没有看到任何显著的时间差。

任何帮助,将不胜感激。

+0

为什么你认为列表解析通常比循环更快?鉴于你在理解中实际使用了for循环。 – ForceBru

+2

除非你真的没有更好的选择,否则你不应该使用list comprehensions *或*'for'循环与NumPy数组。 – user2357112

+0

思想列表理解通常比for循环快一点点,因为它不必在每次迭代中查找列表及其附加方法。 – Callahan

回答

2

首先,如果您确实是指np.matrix,请停止使用np.matrix。它有各种各样令人讨厌的不兼容性,现在矩阵乘法存在@,它的作用已经过时。即使你被困在没有@的Python版本上,在正常的ndarray下使用dot的方法仍然比处理np.matrix要好。

除非您确定没有更好的选项,否则不应使用任何类型的Python级迭代构造和NumPy数组,无论是for循环还是列表解析。假设A是2D和B是一维与形状(q, q)(q,)分别,你应该不是这种情况下做的是

A *= B 
A /= B[:, np.newaxis] 

broadcastingA操作。这将允许NumPy直接在数组的底层数据缓冲区上执行C级迭代,而不必创建包装对象并对每个操作执行动态分派。