julia - Julia,将数组的选定元素转换为具有二项式频率的新数字
问题描述
我正在尝试独立选择满足条件的数组元素,然后以给定的频率将这些元素转换为不同的值。在 R 中我会使用 rbinom,但在 Julia 中找不到正确的函数。MWE:
#create array
a = [3,4,3,6,3];
# convert elements that match ==3 to 9
a[a .==3] .=9;
a
[9,4,9,6,9]
但我不知道该怎么做是用二项式概率(可能是伯努利?)的转换,例如,0.66 所以转换a
后可能最终为
[3,4,9,6,9]
我想我想要的是这样的:
a[a .==3] .= bernoulli(0.66)9
这样从 3 转换为 9 的概率是 0.66。所以 66% 的时间它会将 3 转换为 9,而剩下的 33% 则将其保留为 3。有意义吗?
我想对 3 的每个实例独立进行评估,而不是提取所有 3 的索引向量,然后计算有多少以概率转换(如果这有任何意义?!)Thx J
解决方案
我不知道这里有任何预制解决方案(我真的不熟悉该领域),但您可以轻松推出自己的解决方案。
我认为您实际上应该使用伯努利分布,除非我弄错了。您可以使用Bernoulli
Distributions.jl,也可以使用普通的 old 制作自己的rand
:
using Distributions: Bernoulli
function rbinom!(xs, subst::Pair, p=1.0)
(x, y) = subst
dist = Bernoulli(p)
for (i, val) in pairs(xs)
if val == x && rand(dist)
xs[i] = y
end
end
return xs
end
如果你不想导入 Distributions.jl,你可以写
function rbinom!(xs, subst::Pair, p=1.0)
(x, y) = subst
for (i, val) in pairs(xs)
if val == x && rand() < p # or rand() <= p ?
xs[i] = y
end
end
return xs
end
你这样称呼它:
julia> a = [3,4,3,6,3];
julia> rbinom!(a, 3=>9, 0.66)
5-element Array{Int64,1}:
9
4
9
6
3
请注意,此函数会a
就地更新向量。如果您不希望这样,您可以创建一个包装函数,发送以下副本a
:
rbinom(xs, args...) = rbinom!(copy(xs), args...)
推荐阅读
- android - 如何在 coordinatorLayout 内的 RelativeLayout 底部对齐 LinearLayout
- python - 将少量包裹装入固定数量的箱中
- python - 当用户输入不正确时如何从某个特定点重复代码
- javascript - 猫鼬不保存对文档的更改
- hadoop - 失败:此处不支持 ParseException 行 3:0 字符“”
- javascript - 将带有html的js字符串文字传递给组件并保留html
- javascript - JSON - 使用 fetch API (Vanilla JS) 时如何在每页获取超过 100 个对象
- javascript - Uncaught ReferenceError: Vue is not defined - 但只是有时
- c# - OAuth 2.0 WebServer 与 API Webserver 分离
- opengl - 在延迟渲染中使用深度缓冲区进行线框渲染