如果np数组中的随机元素不是某个值,那么如何选择它

时间:2014-03-16 18:23:03

标签: python arrays numpy

我正在使用python

我有一个简单的问题,但我看不到它。

如果我有一个数组x = array([1.0,0.0,1.5,0.0,6.0])y = array([1,2,3,4,5])

我正在寻找一种有效的方法,在1.01.56.0之间随机选择,忽略所有零,同时保留索引以与另一个array进行比较,例如y。因此,如果我要随机选择6.0,我仍然可以将其与y[4]相关联。

有效位的原因是最终我想在1000+的数组中可能有10个值之间进行选择,其余为0。取决于其他计算的密集程度取决于数组的大小,尽管它很容易变得远大于1000。

谢谢

2 个答案:

答案 0 :(得分:3)

.nonzero()只会跳过0,因为您要跳过的任何值都是一个解决方案:

In [281]:

x = np.array([1.0,0.0,1.5,0.0,6.0])
non_zero_idx=np.argwhere(x!=0).flatten()
np.random.shuffle(non_zero_idx)
random_pick=x[non_zero_idx]
random_pick[0]
Out[281]:
1.5
In [282]:

%%timeit

x = np.array([1.0,0.0,1.5,0.0,6.0])
non_zero_idx=np.argwhere(x!=0).flatten()
np.random.shuffle(non_zero_idx)
random_pick=x[non_zero_idx]
random_pick[0]
10000 loops, best of 3: 104 µs per loop

如果您只想获得一个随机选择(而不是array随机选择),x[np.random.choice(non_zero_idx,1)]就足够了。但这实际上很慢:

In [286]:

%%timeit

x = np.array([1.0,0.0,1.5,0.0,6.0])
non_zero_idx=np.argwhere(x!=0).flatten()
x[np.random.choice(non_zero_idx,1)]
10000 loops, best of 3: 173 µs per loop

正如@AndyHayden所指出的,有三种获取随机选择的方法,表现出不同的数组大小:

In [299]:

X=np.random.random(100000)
In [300]:

%timeit np.random.choice(X, 1)
%timeit X[np.random.randint(0,len(X),1)]
10000 loops, best of 3: 70.3 µs per loop
100000 loops, best of 3: 12.6 µs per loop
In [301]:

%%timeit
np.random.shuffle(X)
X[0]
10 loops, best of 3: 130 ms per loop

In [302]:

X=np.random.random(10000)
In [303]:

%timeit np.random.choice(X, 1)
%timeit X[np.random.randint(0,len(X),1)]
10000 loops, best of 3: 70.1 µs per loop
100000 loops, best of 3: 12.6 µs per loop
In [304]:

%%timeit
np.random.shuffle(X)
X[0]
100 loops, best of 3: 12.6 ms per loop

出现X[np.random.randint(0,len(X),1)]是最好的。

答案 1 :(得分:1)

如果您愿意接受概率时间且忽略的值少于50%,则可以重试,直到您拥有可接受的值。

如果你不能,你将不得不至少重复整个数组一次,知道要忽略哪些值,但需要n个内存。