从python中的2D数组中随机采样子数组
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了从python中的2D数组中随机采样子数组,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5304字,纯文字阅读大概需要8分钟。
内容图文
![从python中的2D数组中随机采样子数组](/upload/InfoBanner/zyjiaocheng/668/98e3ef91ad524e7985d4926a21c1a34a.jpg)
问题:
假设我有一个2D阵列,我想从中随机采样(使用蒙特卡洛)较小的2D子阵列,如下图中的黑色小块所示.我正在寻找一种有效的方法.
预期(但部分)的解决方案:
我遇到了一个function,在经过几个小时的搜索后,它部分实现了我要尝试的功能,但是它缺乏在随机位置采样补丁的功能.至少我不认为它可以基于其参数从随机位置进行采样,尽管它确实具有一个我不理解的random_state参数.
sklearn.feature_extraction.image.extract_patches_2d(image, patch_size, max_patches=None, random_state=None)
题:
选择随机面片坐标(2D子阵列),然后使用它们从较大的阵列中切出面片,如上图所示.允许随机采样的色块重叠.
解决方法:
这是一个采样器,可以从任何尺寸的数组中创建一个样本.它使用功能来控制从何处开始切割以及沿任何轴的切割宽度.
这是参数的说明:
> arr-输入numpy数组.
> loc_sampler_fn-这是您要用来设置框角的函数.如果要从轴上的任何位置均匀采样框的角,请使用np.random.uniform.如果您希望拐角更靠近数组的中心,请使用np.random.normal.但是,我们需要告诉函数要采样的范围.这将我们带入下一个参数.
> loc_dim_param-这会将每个轴的大小传递给loc_sampler_fn.如果我们将np.random.uniform用于位置采样器,则希望从轴的整个范围进行采样. np.random.uniform具有两个参数:低和高,因此,通过将轴的长度传递到高,可以在整个轴上均匀采样.换句话说,如果轴的长度为120,我们需要np.random.uniform(low = 0,high = 120),因此我们将loc_dim_param =’high’设置为1.
> loc_params-这会将任何其他参数传递给loc_sampler_fn.与该示例保持一致,我们需要将low = 0传递给np.random.uniform,因此需要传递字典loc_params = {‘low’:0}.
从这里开始,盒子的形状基本上是相同的.如果要从3到10均匀采样框的高度和宽度,请传入shape_sampler_fn = np.random.uniform,其中shape_dim_param = None,因为我们没有将轴的大小用于任何东西,并且shape_params = {‘low ‘:3,’high’:11}.
def box_sampler(arr,
loc_sampler_fn,
loc_dim_param,
loc_params,
shape_sampler_fn,
shape_dim_param,
shape_params):
'''
Extracts a sample cut from `arr`.
Parameters:
-----------
loc_sampler_fn : function
The function to determine the where the minimum coordinate
for each axis should be placed.
loc_dim_param : string or None
The parameter in `loc_sampler_fn` that should use the axes
dimension size
loc_params : dict
Parameters to pass to `loc_sampler_fn`.
shape_sampler_fn : function
The function to determine the width of the sample cut
along each axis.
shape_dim_param : string or None
The parameter in `shape_sampler_fn` that should use the
axes dimension size.
shape_params : dict
Parameters to pass to `shape_sampler_fn`.
Returns:
--------
(slices, x) : A tuple of the slices used to cut the sample as well as
the sampled subsection with the same dimensionality of arr.
slice :: list of slice objects
x :: array object with the same ndims as arr
'''
slices = []
for dim in arr.shape:
if loc_dim_param:
loc_params.update({loc_dim_param: dim})
if shape_dim_param:
shape_params.update({shape_dim_param: dim})
start = int(loc_sampler_fn(**loc_params))
stop = start + int(shape_sampler_fn(**shape_params))
slices.append(slice(start, stop))
return slices, arr[slices]
在宽度在3到9之间的2D阵列上均匀切割的示例:
a = np.random.randint(0, 1+1, size=(100,150))
box_sampler(a,
np.random.uniform, 'high', {'low':0},
np.random.uniform, None, {'low':3, 'high':10})
# returns:
([slice(49, 55, None), slice(86, 89, None)],
array([[0, 0, 1],
[0, 1, 1],
[0, 0, 0],
[0, 0, 1],
[1, 1, 1],
[1, 1, 0]]))
从10x20x30 3D数组中提取2x2x2块的示例:
a = np.random.randint(0,2,size=(10,20,30))
box_sampler(a, np.random.uniform, 'high', {'low':0},
np.random.uniform, None, {'low':2, 'high':2})
# returns:
([slice(7, 9, None), slice(9, 11, None), slice(19, 21, None)],
array([[[0, 1],
[1, 0]],
[[0, 1],
[1, 1]]]))
根据评论进行更新.
对于您的特定目的,您似乎想要一个矩形样本,该样本的起始角是从数组中的任何位置均匀采样的,并且沿每个轴的样本宽度是均匀采样的,但是可以限制.
这是一个生成这些样本的函数. min_width和max_width可以接受整数(例如元组)或单个整数的可迭代值.
def uniform_box_sampler(arr, min_width, max_width):
'''
Extracts a sample cut from `arr`.
Parameters:
-----------
arr : array
The numpy array to sample a box from
min_width : int or tuple
The minimum width of the box along a given axis.
If a tuple of integers is supplied, it my have the
same length as the number of dimensions of `arr`
max_width : int or tuple
The maximum width of the box along a given axis.
If a tuple of integers is supplied, it my have the
same length as the number of dimensions of `arr`
Returns:
--------
(slices, x) : A tuple of the slices used to cut the sample as well as
the sampled subsection with the same dimensionality of arr.
slice :: list of slice objects
x :: array object with the same ndims as arr
'''
if isinstance(min_width, (tuple, list)):
assert len(min_width)==arr.ndim, 'Dimensions of `min_width` and `arr` must match'
else:
min_width = (min_width,)*arr.ndim
if isinstance(max_width, (tuple, list)):
assert len(max_width)==arr.ndim, 'Dimensions of `max_width` and `arr` must match'
else:
max_width = (max_width,)*arr.ndim
slices = []
for dim, mn, mx in zip(arr.shape, min_width, max_width):
fn = np.random.uniform
start = int(np.random.uniform(0,dim))
stop = start + int(np.random.uniform(mn, mx+1))
slices.append(slice(start, stop))
return slices, arr[slices]
生成从数组中的任意位置均匀开始的箱形切割的示例,高度为1到4的随机均匀绘制,宽度为2到6的随机均匀绘制(仅显示).在这种情况下,框的大小从第66行和第19列开始为3×4.
x = np.random.randint(0,2,size=(100,100))
uniform_box_sampler(x, (1,2), (4,6))
# returns:
([slice(65, 68, None), slice(18, 22, None)],
array([[1, 0, 0, 0],
[0, 0, 1, 1],
[0, 1, 1, 0]]))
内容总结
以上是互联网集市为您收集整理的从python中的2D数组中随机采样子数组全部内容,希望文章能够帮你解决从python中的2D数组中随机采样子数组所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。