В следующем примере кода я хочу заменить патчи размером ps x ps
во многих изображениях нулями, единицами или случайными числами. Вот пример:

Чтобы сделать цикл for чистым, быстрым и скрипт Python коротким, я хотел определить функцию patch_fct
перед входом в цикл for, который выполняет эту работу. К сожалению, функции np.zeros
и np.ones
отличаются таким образом от np.random.rand
и np.random.randn
, что они принимают разные аргументы для определения размера вывода. Для матрицы 2x2 я делаю следующее, чтобы получить матрицу с единицами:
np.ones((2,2))
и я
np.random.rand(2,2)
если я хочу матрицу со случайными числами.
Вот полностью рабочий пример кода. Если я использую patch_fct((ps,ps))
в цикле for, он работает только для «единиц» и «нулей». Чтобы работать со случайными числами, мне нужно изменить эту строку на patch_fct(ps,ps)
.
Есть ли способ сделать это в любом случае?
import numpy as np
import matplotlib.pyplot as plt
n_images = 100
w_size = 30
h_size = 30
patch_type = "ones"
ps = 4
images = -np.ones((n_images, h_size, w_size))
x0 = np.random.randint(0, w_size - ps, n_images)
y0 = np.random.randint(0, h_size - ps, n_images)
if patch_type == "zeros":
patch_fct = np.zeros
elif patch_type == "ones":
patch_fct = np.ones
elif patch_type == "rand":
patch_fct = np.random.rand
elif patch_type == "randn":
patch_fct = np.random.randn
else:
raise "Error patch type"
for i, x, y, x1, y1 in zip(range(n_images), x0, y0, x0 + ps, y0 + ps):
images[i, x:x1, y:y1] = patch_fct((ps,ps)) # <-- PROBLEM:
for k in range(25):
plt.subplot(5,5,k+1)
plt.imshow(images[k])
plt.axis("off")
plt.show()