Назначение функций перед входом в цикл for в Python - PullRequest
0 голосов
/ 27 августа 2018

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

enter image description here

Чтобы сделать цикл 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()

1 Ответ

0 голосов
/ 27 августа 2018

Существуют предварительно определенные функции, которые принимают кортежи:

Прочитайте документы, для np.random.rand:

Это удобная функция. Если вам нужен интерфейс, который принимает кортеж формы в качестве первого аргумента, обратитесь к np.random.random_sample.


А для np.random.randn:

Это удобная функция. Если вы хотите интерфейс, который принимает кортеж в качестве первого аргумента, используйте вместо него numpy.random.standard_normal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...