首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何有效地在numpy中对卷进行采样?

如何有效地在numpy中对卷进行采样?
EN

Stack Overflow用户
提问于 2017-03-23 06:00:54
回答 1查看 440关注 0票数 1

我在numpy中有一个三维布尔数组。我想从那些具有True值的元素中选择一个随机元素(如果有的话)。选择任何True元素的概率应该是相同的。我需要选定元素的坐标。

可以工作但不是特别快的方法:

  • 随机选择元素并检查它们是否为真
  • 形成所有True元素的索引列表(例如,使用numpy.nonzero),然后随机从中挑选

该数组通常是一个大小为256x256x256的立方体。真实元素约占总数的1%至10%。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-23 06:24:41

我不确定你的方法是否能以一种主要的方式得到改善。无论如何,这里有一个flatnonzero解决方案和一个用于比较的试错解决方案:

代码语言:javascript
运行
复制
import numpy as np
from timeit import timeit

def pick_true(data, n):
    nz = np.flatnonzero(data)
    return np.unravel_index(np.random.choice(nz, n), data.shape)


def pick_true_2(data, n, p):
    pick = np.random.randint(0, data.size, (int(round(n/p)),))
    return np.unravel_index(pick[data.ravel()[pick]], data.shape)

data = np.random.random((256,256,256)) < 0.01

print(pick_true(data, 10), data[pick_true(data, 10)])

print('indexing small {:6.4f} secs'.format(timeit(lambda: pick_true(data, 100), number=10)/10))
print('indexing large {:6.4f} secs'.format(timeit(lambda: pick_true(data, 10000), number=10)/10))


print(pick_true_2(data, 10, 0.01), data[pick_true_2(data, 10, 0.01)])

print('non-indexing small {:6.4f} secs'.format(timeit(lambda: pick_true_2(data, 100, 0.01), number=10)/10))
print('non-indexing large {:6.4f} secs'.format(timeit(lambda: pick_true_2(data, 10000, 0.01), number=10)/10))

样本输出:

代码语言:javascript
运行
复制
(array([  8, 164, 247, 160, 154, 147, 146,  73,  89,   1]),
array([ 89,   0,   7, 217,  46,  45, 139, 205, 163,  92]),
array([ 70, 129,  92,   7,  14, 155, 148,  51, 146, 176]))
[ True  True  True  True  True  True  True  True  True  True]
indexing small 0.0072 secs
indexing large 0.0090 secs
(array([ 29, 113,   7,  18, 159, 203,  97,  45]),
array([227, 251,   8, 137,  61, 226, 170,  17]),
array([249,  28, 160,  99,  99, 191, 174, 234]))     
[ True  True  True  True  True  True  True  True]
non-indexing small 0.0002 secs
non-indexing large 0.0206 secs
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42968327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档