如何用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
相关产品推荐
相关产品推荐

