规范化2d数组

时间:2018-03-09 11:55:00

标签: python arrays numpy matrix

考虑包含正数的方阵,以2d numpy数组A((m,m))给出。我想构建一个新的数组B,它具有相同的形状和条目

B[i,j] = A[i,j] / (np.sqrt(A[i,i]) * np.sqrt(A[j,j]))

一个明显的解决方案是遍历所有(i,j),但我想知道是否有更快的方法。

2 个答案:

答案 0 :(得分:4)

可以提出两种利用broadcasting的方法。

方法#1:

d = np.sqrt(np.diag(A))
B = A/d[:,None]
B /= d

方法#2:

B = A/(d[:,None]*d) # d same as used in Approach #1

方法#1具有较小的内存开销,因此我认为会更快。

答案 1 :(得分:1)

您可以使用

通过主对角线利用广播来规范化阵列的每一行
secondmsg

此外,您可以使用

对每列进行标准化
b = np.sqrt(np.diag(a))
a / b[:, None]

要做到这两点,正如你的问题似乎要问的那样,使用

a / b[None, :]

如果要阻止创建中间数组并进行适当的操作,可以使用

a / (b[:, None] * b[None, :])
相关问题