hrithik mahesh
hrithik mahesh

Reputation: 113

vectorized implementation without using for loops

I'm trying to implement this code but it's quite slow because of two for loops. Can anyone suggest vectorized version of this code, please?

import numpy as np
P,Q = 1000,1000
thresh = 100
H = np.zeros((P,Q)
for u in range(P):
  for v in range(Q):
    if dist(u, v, P, Q) <= thresh:
       H_LP[u, v] = 1
def dist(u, v, p, q):
    return np.sqrt(np.square(u - p / 2) + np.square(v - q / 2))

Upvotes: 0

Views: 75

Answers (3)

hrithik mahesh
hrithik mahesh

Reputation: 113

import numpy as np
P,Q = 1000,1000
thresh = 100
idx_H = np.stack(np.indices((P, Q)), axis=-1)
H_LP = dist(idx_H[..., 0], idx_H[..., 1], P, Q) <= thresh
def dist(u, v, p, q):
    return np.sqrt(np.square(u - p / 2) + np.square(v - q / 2))

Upvotes: -1

swag2198
swag2198

Reputation: 2696

Try this.

import numpy as np

P,Q = 1000,1000
thresh = 100

u = np.arange(P)
v = np.arange(Q)

dist_mat = np.sqrt(((u - P/2)**2)[:, None] + ((v - Q/2)**2)[None, :])
H = np.zeros((P, Q))
H[dist_mat <= thresh] = 1

Upvotes: 3

Kenan
Kenan

Reputation: 14094

I think numba can speed up your code

import numpy as np
import numba
P,Q = 1000,1000
thresh = 100
H = np.zeros((P,Q)

@jit(nopython=True)
def function(P, Q, thresh, H):
    for u in range(P):
      for v in range(Q):
        if dist(u, v, P, Q) <= thresh:
           H_LP[u, v] = 1

def dist(u, v, p, q):
    return np.sqrt(np.square(u - p / 2) + np.square(v - q / 2))

Upvotes: 1

Related Questions