考虑包含正数的方阵,以2d numpy数组A((m,m))给出。我想构建一个新的数组B,它具有相同的形状和条目
B[i,j] = A[i,j] / (np.sqrt(A[i,i]) * np.sqrt(A[j,j]))
一个明显的解决方案是遍历所有(i,j),但我想知道是否有更快的方法。
答案 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, :])