You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Numpy重复随机函数生成类伯努利分布数组(禁用binomial)

解决方法

一、修复numpy.fromfunction的用法

你之前的问题核心在于:fromfunction会把对应形状的坐标数组传给你的函数,而非逐个传入单个元素。如果函数里只生成单个随机值(比如np.random.rand()),这个标量会被广播到整个坐标数组,导致所有元素全0或全1。

正确的用法是让函数生成和目标形状一致的随机数数组,忽略传入的坐标参数(因为随机数不依赖位置):

import numpy as np

def generate_bernoulli(shape, p=0.5):
    # 忽略坐标参数,直接生成对应形状的随机数组并做阈值判断
    return np.fromfunction(lambda *args: np.random.random(size=shape) < p, shape).astype(int)

# 生成12个元素的目标数组
result = generate_bernoulli((12,), p=0.5)
print(result)
# 输出示例:[0 1 0 1 1 1 1 0 1 1 1 1]

二、更直接的替代方法

fromfunction更适合生成依赖位置的数组,对于无位置依赖的随机数组,以下两种方法更高效简洁:

1. 直接用numpy.random.random生成

这是最推荐的方案,直接生成对应形状的随机数数组,再通过阈值判断转成0/1:

import numpy as np

def custom_bernoulli(shape, p=0.5):
    # 生成[0,1)区间的随机数组,小于p的转为1,否则为0
    return (np.random.random(size=shape) < p).astype(int)

# 调用示例
arr = custom_bernoulli((12,))
print(arr)

2. 重复调用自定义随机函数f()

如果必须使用自定义的f()(比如自有随机逻辑),可以用numpy.fromiter从迭代器生成数组:

import numpy as np
import random

# 自定义随机函数:返回0或1,概率各0.5
def f():
    return 1 if random.random() < 0.5 else 0

# 生成12个元素的数组
arr = np.fromiter((f() for _ in range(12)), dtype=int)
print(arr)

注意:np.fromiter本质是逐个调用f(),效率低于numpy原生数组操作,仅适合自定义逻辑无法向量化的场景。

内容的提问来源于stack exchange,提问作者newone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:47:06