首页 > 解决方案 > 在 Python 中进入 for 循环之前的函数分配

问题描述

在下面的示例代码中,我想ps x ps用零、一或随机数替换大量图像中大小的补丁。这是一个例子:

在此处输入图像描述

为了保持 for 循环干净、快速且 python 脚本简短,我想patch_fct在进入 for 循环之前定义一个函数,它可以完成这项工作。不幸的是,这些函数np.zerosnp.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()

标签: pythonnumpy

解决方案


有一些采用元组的预定义函数:

阅读文档,用于np.random.rand

这是一个便利功能。如果您想要一个将 shape-tuple 作为第一个参数的接口,请参阅np.random.random_sample.


对于np.random.randn

这是一个便利功能。如果您想要一个将元组作为第一个参数的接口,请numpy.random.standard_normal改用。


推荐阅读