I have an array I
which stores N
images of size P
(number of pixels). Every image is of size P = q*q
.
Now I want to delete patches of size ps
around a selected index IDX
(set all values to zero).
My approach was to reshape every single image using reshape(q,q)
and delete the pixels around IDX
. I also have to check if the index is not outside the image.
Here is an example:
My code is a real bottleneck and I would like to know if there is a way to improve the performance of my approach.
import numpy as np
import matplotlib.pyplot as plt
import time
def myplot(I):
imgs = 5
for i in range(imgs**2):
plt.subplot(imgs,imgs,(i+1))
plt.imshow(I[i].reshape(q,q), cmap="viridis", interpolation="none")
plt.axis("off")
plt.show()
N = 10000
q = 28
P = q*q
I = np.ones((N,P))
myplot(I)
ps = 5
IDX = np.random.randint(0,P,(N,1))
x0, y0 = np.unravel_index(IDX,(q,q))
t0 = time.time()
# HOW TO IMPROVE THIS PART ? #
for i in range(N):
img = I[i].reshape(q,q)
for x in range(ps):
for y in range(ps):
if (x0[i]+x < q) and (y0[i]+y < q):
img[x0[i]+x,y0[i]+y] = 0.0
I[i] = img.reshape(1,q*q)
print(time.time()-t0)
myplot(I)
I call this code (without the plotting procedure) about one million times from another code. Every call takes about 1 second on my system. This makes the code so far quite useless.
Any advice?