我可以用Numpy制作随机面具吗?

时间:2017-12-22 11:52:04

标签: python numpy random boolean

我正在使用Python进行图像处理。

我试图从图像中随机提取一些像素。

用Numpy制作随机面具是不可能的吗?

我现在想的是将10000行数组的1000个元素设为True,其他所有为False,是否可以实现这一点?

另外,如果不可能,还有其他方法可以制作随机面具吗? 谢谢。

5 个答案:

答案 0 :(得分:11)

创建一个#! /usr/bin/expect -f set A A.txt set B B.txt spawn scp \ user@remote:/home/user/{$A,$B} \ /home/user/Documents expect "password: " send "somesecretpwd" interact 值数组,将第一个False元素设置为1000

True

然后简单地将数组洗牌

a = np.full(10000, False)
a[:1000] = True

对于稍微快一点的解决方案,您还可以创建一个整数零的数组,将一些值设置为np.random.shuffle(a) ,随机播放并将其转换为1

bool

在这两种情况下,您都会有一个数组a = np.zeros(10000, dtype=int) a[:1000] = 1 np.random.shuffle(a) a = a.astype(bool) 在随机位置上只有1000 a个元素

如果您希望从True单独挑选每个元素,则可以使用

[True, False]

但请注意,您无法预测数组中np.random.choice([True, False], size=10000, p=[0.1, 0.9]) 个元素的数量。你只知道平均你将拥有1000个。

答案 1 :(得分:1)

一个常见的解决方案是创建一个随机整数索引数组,可以使用numpy的随机choice来有效地完成此操作。

使用此设置:

n_dim = 10_000  # size of the original array
n = 100         # size of the random mask
rng = np.random.default_rng(123)

要创建随机索引数组,我们可以使用numpy的choice传递 array size 作为第一个参数:

In [5]: %%timeit  
   ...: m = rng.choice(n_dim, replace=False, size=n) 
   ...:  
   ...:                                                                                                                                  
21.9 µs ± 161 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

作为比较,其他答案中提到的布尔数组方法(需要将0和1s的数组改组)要慢得多(在此示例中慢10倍):

In [7]: %%timeit 
   ...: m = np.hstack([np.ones(n, dtype=bool), np.zeros(n_dim - n, dtype=bool)]) 
   ...: rng.shuffle(m) 
   ...:  
   ...:                                                                                                                                  
261 µs ± 604 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)

注意:在稀疏情况下,即从原始数组中选择一小部分样本时,整数索引最有效。在这种情况下,整数索引的RAM使用率将比布尔掩码低得多。当样本比例超过原始阵列的10..20%时,布尔蒙版方法将更加有效。

注意2 整数索引将以随机顺序返回样本。为了在保持顺序的同时对数组进行随机采样,您需要对索引进行排序。防毒面具会自然返回分类的样本。

总而言之,如果您正在执行稀疏采样并且不关心采样项的顺序,则此处显示的整数索引可能会胜过其他方法。

答案 2 :(得分:0)

In [7]: import numpy as np 

In [8]: mask=np.array( [False]*10000)

In [9]: inds=np.random.choice(np.arange(10000),size=1000)

In [10]: mask[inds]=True

现在,面具的前100个元素是

In [11]: print(mask[:100])
[False False False False False  True False False False False False False
 False False False False False False False False False False  True False
 False False False False False False False  True  True False  True False
 False False False False False False False False False False  True False
 True False False False False False False False False False False False
 False False False False False False  True False False False False False
 False False  True False False False False False False False False False
 False False  True False False False False False False False False False
 False False False False]

答案 3 :(得分:0)

与Nils Werner的答案类似,但更直接:

import numpy as np

size = 10000
num_true = 1000
mask = np.concat([np.ones(num_true, dtype=bool), np.zeros(size - num_true, dtype=bool)])
np.random.shuffle(mask)

同样快;使用IPython的%%timeit魔术:

%%timeit
a = np.zeros(size, dtype=int)
a[:num_ones] = 1
np.random.shuffle(a)
a = a.astype(bool)

退出:217 µs ± 2.33 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
mask = np.concat([np.ones(num_true, dtype=bool), np.zeros(size - num_true, dtype=bool)])
np.random.shuffle(mask)

退出:201 µs ± 1.32 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

答案 4 :(得分:0)

另一种选择:

import numpy as np

size = 1000
zero_density = 0.1   # 0.0 => all false / unset
mask = np.random.random(size=size) < zero_density