gpt4 book ai didi

python - 有效使用 numpy.random.choice 与重复数字和备选方案

转载 作者:太空狗 更新时间:2023-10-30 02:02:44 24 4
gpt4 key购买 nike

我需要生成一个包含重复元素的大数组,我的代码是:

np.repeat(xrange(x,y), data)

但是,数据是一个类型为 float64 的 numpy 数组(但它表示整数,那里没有 2.1),我收到错误

TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe'

例子:

In [35]: x
Out[35]: 26

In [36]: y
Out[36]: 50

In [37]: data
Out[37]:
array([ 3269., 106., 5533., 317., 1512., 208., 502., 919.,
406., 421., 1690., 2236., 705., 505., 230., 213.,
307., 1628., 4389., 1491., 355., 103., 854., 424.])
In [38]: np.repeat(xrange(x,y), data)

---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-38-105860821359> in <module>()
----> 1 np.repeat(xrange(x,y), data)

/home/pcadmin/anaconda2/lib/python2.7/site-packages/numpy /core/fromnumeric.pyc in repeat(a, repeats, axis)
394 repeat = a.repeat
395 except AttributeError:
--> 396 return _wrapit(a, 'repeat', repeats, axis)
397 return repeat(repeats, axis)
398

/home/pcadmin/anaconda2/lib/python2.7/site-packages/numpy /core/fromnumeric.pyc in _wrapit(obj, method, *args, **kwds)
46 except AttributeError:
47 wrap = None
---> 48 result = getattr(asarray(obj), method)(*args, **kwds)
49 if wrap:
50 if not isinstance(result, mu.ndarray):

TypeError: Cannot cast array data from dtype('float64') to dtype('int64') according to the rule 'safe'

我把代码改成

np.repeat(xrange(x,y), data.astype('int64'))

但是,现在这是我代码中最昂贵的行之一!!还有其他选择吗?

顺便说一句,我在里面用这个

np.random.choice(np.repeat(xrange(x,y), data.astype('int64')), z)

为了获得样本而不用替换为 x 和 y 之间整数的大小 z,每个样本的数量在数据中给出。我想这也是最好的方法吧?

最佳答案

潜伏在问题中的是 multivariate hypergeometric distribution .在 Numpy drawing from urn ,我实现了一个从这个分布中抽取样本的函数。我怀疑它与答案中描述的解决方案@DiogoSantos 非常相似。 Diogo 说使用这种方法很慢,但我发现以下方法比 Divakar 的 optmized_v1 更快。​​

这是一个函数,它使用链接答案中的 sample(n, colors) 来实现与 Divakar 的函数具有相同签名的函数。

def hypergeom_version(x, y, z, data):
s = sample(z, data)
result = np.repeat(np.arange(x, y), s)
return result

(这将按排序的顺序返回值。如果您需要按随机顺序排列值,请在返回语句之前添加 np.random.shuffle(result) . 它不会显着改变执行时间。)

比较:

In [153]: x = 100

In [154]: y = 100100

In [155]: z = 10000

In [156]: data = np.random.randint(1, 125, (y-x)).astype(float)

Divakar 的 optimized_v1:

In [157]: %timeit optimized_v1(x, y, z, data)
1 loop, best of 3: 520 ms per loop

hypergeom_version:

In [158]: %timeit hypergeom_version(x, y, z, data)
1 loop, best of 3: 244 ms per loop

如果data中的值越大,相对性能就更好:

In [164]: data = np.random.randint(100, 500, (y-x)).astype(float)

In [165]: %timeit optimized_v1(x, y, z, data)
1 loop, best of 3: 2.91 s per loop

In [166]: %timeit hypergeom_version(x, y, z, data)
1 loop, best of 3: 246 ms per loop

关于python - 有效使用 numpy.random.choice 与重复数字和备选方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39267947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com