简体   繁体   中英

Normalize 2d arrays

Consider a square matrix containing positive numbers, given as a 2d numpy array A of shape ((m,m)). I would like to build a new array B that has the same shape with entries

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

An obvious solution is to loop over all (i,j) but I'm wondering if there is a faster way.

Two approaches leveraging broadcasting could be suggested.

Approach #1 :

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

Approach #2 :

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

Approach #1 has lesser memory overhead and as such I think would be faster.

You can normalize each row of your array by the main diagonal leveraging broadcasting using

b = np.sqrt(np.diag(a))
a / b[:, None]

Also, you can normalize each column using

a / b[None, :]

To do both, as your question seems to ask, using

a / (b[:, None] * b[None, :])

If you want to prevent the creation of intermediate arrays and do the operation in place, you can use

a /= b[:, None]
a /= b[None, :]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM