列表理解np矩阵

时间:2017-08-30 17:32:35

标签: python numpy

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

# 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))])

但我认为我采取了错误的方法,因为我没有看到任何明显的时差。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

首先,如果你真的是np.matrix,请停止使用np.matrix。它具有各种令人讨厌的不兼容性,并且由于存在用于矩阵乘法的@,它的作用已经过时。即使你坚持使用@的Python版本,使用普通ndarrays的dot方法仍然比处理np.matrix更好。

除非你确定没有更好的选择,否则你不应该使用NumPy数组的任何类型的Python级迭代构造,无论是for循环还是列表推导。假设A是2D而B是1D,形状分别为(q, q)(q,),那么你应该为这种情况做的是

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

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