Python 使用给定范围内的随机值填充numpy数组?
我希望能够用一组随机值为数组(实际上是图像文件)加边框。Python 使用给定范围内的随机值填充numpy数组?,python,numpy,random,padding,Python,Numpy,Random,Padding,我希望能够用一组随机值为数组(实际上是图像文件)加边框。numpy.pad()。有没有一种简捷的方法来实现这一点,或者我必须从头开始创建一个函数?这可能不是最节省空间的方法,但有一种方法是创建一个新阵列,并将现有阵列放在该阵列的中心 >>> import numpy as np >>> np.random.seed(444) >>> arr = np.zeros((4, 5)) # your image array >>>
numpy.pad()。有没有一种简捷的方法来实现这一点,或者我必须从头开始创建一个函数?这可能不是最节省空间的方法,但有一种方法是创建一个新阵列,并将现有阵列放在该阵列的中心
>>> import numpy as np
>>> np.random.seed(444)
>>> arr = np.zeros((4, 5)) # your image array
>>> newsize = tuple(i + 2 for i in arr.shape)
>>> new = np.random.randint(low=0, high=50, size=newsize)
>>> new[1:-1, 1:-1] = arr
>>> new
array([[ 3, 48, 23, 8, 3, 39, 12],
[47, 0, 0, 0, 0, 0, 15],
[34, 0, 0, 0, 0, 0, 0],
[ 6, 0, 0, 0, 0, 0, 6],
[39, 0, 0, 0, 0, 0, 13],
[ 2, 15, 9, 34, 9, 24, 25]])
这是假设您的图像是灰度(2d)而不是三维MxNx4 RGBA阵列。在这种情况下,您需要新建[1:-1,1:-1,1:-1]
您也可以通过将可调用函数传递给np.pad()
,但需要注意的是(请参见下文):
用法:
>>> np.pad(arr, 1, pad_random)
array([[23., 19., 6., 47., 17., 7., 26.],
[26., 0., 0., 0., 0., 0., 37.],
[39., 0., 0., 0., 0., 0., 39.],
[39., 0., 0., 0., 0., 0., 42.],
[28., 0., 0., 0., 0., 0., 47.],
[11., 32., 37., 2., 38., 30., 44.]])
警告:看起来,当您将一个函数传递给np.pad()
的mode
参数时,该函数会被多次调用。下面是一个直接来自文档的示例,其中包含一些打印调用:
>>> def pad_with(vector, pad_width, iaxis, kwargs):
... pad_value = kwargs.get('padder', 10)
... print(vector[:pad_width[0]])
... print(vector[-pad_width[1]:])
... vector[:pad_width[0]] = pad_value
... vector[-pad_width[1]:] = pad_value
... return vector
...
>>> arr = np.arange(6).reshape(3, 2)
>>> np.pad(arr, 1, pad_with)
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[10]
[10]
[0]
[0]
[0]
[0]
[0]
[0]
[10]
[10]
array([[10, 10, 10, 10],
[10, 0, 1, 10],
[10, 2, 3, 10],
[10, 4, 5, 10],
[10, 10, 10, 10]])
因此,只要图像不是太大,使用上面的第一种方法可能会更省时。我认为您需要自己创建一个填充函数来传递到np.pad
。
这个用随机整数填充
def random_pad(vec, pad_width, *_, **__):
vec[:pad_width[0]] = np.random.randint(20, 30, size=pad_width[0])
vec[vec.size-pad_width[1]:] = np.random.randint(30,40, size=pad_width[1])
您可以将其与np.pad一起使用,如下所示:
In [13]: img = np.arange(12).reshape(3, 4)
In [14]: img
Out[14]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [15]: np.pad(img, ((2,3), (1,4)), mode=random_pad)
Out[15]:
array([[26, 21, 22, 24, 21, 37, 37, 37, 39],
[26, 25, 23, 29, 20, 39, 38, 30, 31],
[26, 0, 1, 2, 3, 37, 31, 32, 36],
[29, 4, 5, 6, 7, 30, 32, 33, 37],
[24, 8, 9, 10, 11, 33, 34, 33, 37],
[26, 36, 36, 36, 30, 32, 36, 38, 31],
[29, 33, 34, 38, 35, 31, 33, 37, 33],
[23, 37, 33, 33, 34, 32, 37, 33, 35]])
. 您不能将其与pad_with
参数一起使用,并传递随机整数序列或任何您想要的内容吗
In [13]: img = np.arange(12).reshape(3, 4)
In [14]: img
Out[14]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [15]: np.pad(img, ((2,3), (1,4)), mode=random_pad)
Out[15]:
array([[26, 21, 22, 24, 21, 37, 37, 37, 39],
[26, 25, 23, 29, 20, 39, 38, 30, 31],
[26, 0, 1, 2, 3, 37, 31, 32, 36],
[29, 4, 5, 6, 7, 30, 32, 33, 37],
[24, 8, 9, 10, 11, 33, 34, 33, 37],
[26, 36, 36, 36, 30, 32, 36, 38, 31],
[29, 33, 34, 38, 35, 31, 33, 37, 33],
[23, 37, 33, 33, 34, 32, 37, 33, 35]])