numpy按列指定范围生成随机整数越界问题解决方法
问题成因
问题出在对numpy.random.randint的参数逻辑理解错误:
- 该函数签名为
numpy.random.randint(low, high=None, size=None, dtype=int),生成值遵循左闭右开区间规则:- 仅传入
low参数、省略high时,默认生成[0, low)区间的整数,即最小值可取0,最大值严格小于low传入值 - 同时传入
low和high时,才会生成[low, high)区间的整数
- 仅传入
- 你的代码仅给
randint传入了一个元组作为low参数,未传入high参数,且传入元组的每个元素是通过random.randint随机生成的单个数值,并非预设的列范围固定边界,自然会出现0值、数值不符合列范围要求的问题。
另外需要注意:因为是左闭右开区间,要让生成值能取到范围上限(比如第一列要包含50),high参数需要设置为目标上限值+1,即51。
正确实现方法
numpy原生支持low、high传入和数组列数等长的序列,会自动按列匹配对应范围生成随机数,不需要调用Python标准库random模块,也不需要逐列循环,实现效率更高。原代码中导入的pandas、random模块在该需求下无实际作用,可以直接移除。
完整实现代码:
import numpy as np wsn = np.arange(1, 6) # 按列顺序定义取值下界、上界,上界=目标最大值+1适配左闭右开规则 col_lows = [2, 51, 101, 151, 201] col_highs = [51, 101, 151, 201, 251] # 生成3个5行5列的数组,每列自动匹配对应取值范围 t1 = np.random.randint(low=col_lows, high=col_highs, size=(5, 5)) t2 = np.random.randint(low=col_lows, high=col_highs, size=(5, 5)) t3 = np.random.randint(low=col_lows, high=col_highs, size=(5, 5)) print('\nGenerated Data:\t\n\nNumber \t\t\t Task 1 \t\t\t Task 2 \t\t\t Task 3\n') for i in range(len(t1)): print('\t {0} \t {1} \t {2} \t {3}\n'.format(wsn[i], t1[i], t2[i], t3[i]))
生成结果后可以通过以下代码校验每列取值是否符合要求:
# 查看每列最小值,应大于等于对应col_lows值 print(t1.min(axis=0)) # 查看每列最大值,应小于等于对应目标范围上限 print(t1.max(axis=0))
内容的提问来源于stack exchange,提问作者Axix
相关产品推荐
相关产品推荐

