为什么np.random.randn和np.zeros指定数组形状时的传参类型不同?
NumPy 数组构造函数形状传参差异的原因
这个差异完全是NumPy发展过程中的历史遗留问题,没有底层技术层面的必然逻辑,纯粹是不同时期API设计标准不统一导致的。
首先是
np.random.randn、np.random.rand这类早期随机函数的设计背景:
这类函数是NumPy最早版本就存在的API,设计之初完全对标Matlab的同名函数用法,Matlab中生成随机数组就是直接传入多个维度整数作为参数,为了降低Matlab用户迁移到NumPy的学习成本,就直接沿用了这套传参规则,没有采用元组传形状的设计。而
np.zeros、np.ones这类全局数组构造函数,是后续迭代中按照统一规范设计的API:
官方后续制定了统一的参数规则,所有代表数组形状的参数统一要求传入元组,优势非常明显:可以直接将其他数组的shape属性作为参数传入,比如你已有一个数组arr,要生成同形状的全0数组,直接写np.zeros(arr.shape)就可以,不用手动拆解元组为多个独立参数,更符合数组操作的常规使用逻辑。至于同属
np.random模块的randint为什么用元组传形状:randint这类随机函数是后续版本新增的,开发时官方已经意识到早期rand、randn的API设计和全局规范不统一的问题,所以新增的随机类API全部遵循了统一的元组传shape规则,避免进一步加剧API使用的混乱。
如果你经常搞混两种传参规则,推荐直接用NumPy现在主推的新版随机生成器API,所有方法的形状参数规则完全统一:
rng = np.random.default_rng() # 等价于旧版 np.random.randn(3,5) arr_randn = rng.standard_normal((3,5)) # 等价于旧版 np.random.randint(0,10,(3,5)) arr_randint = rng.integers(0, 10, (3,5))
内容的提问来源于stack exchange,提问作者NerdOnTour
相关产品推荐
相关产品推荐

