【编写环境一】遇到常见python函数处理方式
1.python实现两个一维列表合并成一个二维列表
>>> list1 = [1,2,3,4,4]
>>> list2 = [2,3,4,5,2]
>>> z = list(zip(list1,list2))
>>> z
[(1, 2), (2, 3), (3, 4), (4, 5), (4, 2)]
>>> z[1][1]
3
>>> z[0][1]
2
>>> z[2]
(3, 4)
a= [1,2,3,4]
b= [5,6,7,8]
n = len(a)
for i in range(n):
c.append([a[i],b[i]])
print(c)
2.Box() dict()可用于创建连续的空间
from gym import spaces
# 规定action space最小值,最大值以及维度
action_space1 = spaces.Box(low=-1, high=1, shape=(1, ))
# 也可以输入向量,这样space输出的值会与输入向量具有相同维度,不需要另外规定维度(low和high要具有相同维度)
low = np.float32(np.zeros(3))
high = np.float32(np.ones(3))
action_space2 = spaces.Box(low=low,high=high)
# 随机进行采样,观察输出结果
print(action_space1.sample())
print(action_space2.sample())
输出结果:
[0.17719302]
[0.09906013 0.6137293 0.5404117 ]
*Dict()**可用字典(dictionary)的形式储存空间特征,因此可以描述更多特性并用于构建更为复杂的空间
low = np.float32(np.zeros(3))
high = np.float32(np.ones(3))
# 创建有两个不同action的action space
action_space = spaces.Dict({
"action1": spaces.Discrete(10),
"action2": spaces.Box(low=low,high=high)
})
print(action_space.sample())
输出结果:
OrderedDict([('action1', 6), ('action2', array([0.23961447, 0.6493422 , 0.267231 ], dtype=float32))])
可以看到action space中有 action1 和 action2 两个action
Discrete() 可用于创建离散的非负整数空间
# 规定action space中总共有几个动作
# 例如在有名的例子“cartpole”中小车只有两个action选项:向左或向右,因此将数值设为2,则输出会为0或1
action_space = spaces.Discrete(2)
# 测试输出结果
for i in range(5):
print(action_space.sample())
输出结果:
0
1
1
1
1
2.1 OpenAI Gym Discrete和Box spaces同时存在,代码该怎么写
class SampleGym(gym.Env):
def __init__(self, config={}):
self.config = config
#主要就是这个地方
self.action_space = Tuple((Discrete(2), Box(-10, 10, (2,))))
self.observation_space = Box(-10, 10, (2, 2))
self.p_done = config.get("p_done", 0.1)
def reset(self):
return self.observation_space.sample()
def step(self, action):
chosen_action = action[0]
cnt_control = action[1][chosen_action]
if chosen_action == 0:
reward = cnt_control
else:
reward = -cnt_control - 1
print(f"Action, {chosen_action} continuous ctrl {cnt_control}")
return (
self.observation_space.sample(),
reward,
bool(np.random.choice([True, False], p=[self.p_done, 1.0 - self.p_done])),
{},
)
if __name__ == "__main__":
env = SampleGym()
env.reset()
env.step((1, [-1, 2.1])) # should say use action 1 with 2.1
env.step((0, [-1.1, 2.1])) # should say use action 0 with -1.1
2.2 gym中各种离散连续写法
- Discrete: numbered from 0 to n-1. 举例, Discrete(n=4) 表示4个action上下左右。
- Box:在 [low,high] 区间内的n维tensor。 举例,Box(low=0.0, high=255, shape=(210,160,3), dtype=np.uint8) 表示3Dtensor with 100800 bytes。
- MultiBinary: n-shape的binary space。举例,MultiBinary(5) 表示5维的0或1的数组。 MultiBinary([3,2]) 表示3x2维的0或1的数组。
- MultiDiscrete:一系列离散的action space。举例,MultiDiscrete([5,2,2]) 表示三个discrete action space。
- Tuple:用于combine一些space instance。举例,Tuple(spaces=(Box(low=-1.0, high=1.0, shape=(3,), dtype=np.float32), Discrete(n=3), Discrete(n=2))).
- Dict:也是用于combine一些space instance。 举例,Dict({'position':Discrete(2), 'velocity':Discrete(3)})。
Example usage [nested]:
self.nested_observation_space = spaces.Dict({
'sensors': spaces.Dict({
'position': spaces.Box(low=-100, high=100, shape=(3)),
'velocity': spaces.Box(low=-1, high=1, shape=(3)),
'front_cam': spaces.Tuple((
spaces.Box(low=0, high=1, shape=(10, 10, 3)),
spaces.Box(low=0, high=1, shape=(10, 10, 3))
)),
'rear_cam': spaces.Box(low=0, high=1, shape=(10, 10, 3)),
}),
'ext_controller': spaces.MultiDiscrete([ [0,4], [0,1], [0,1] ]),
'inner_state':spaces.Dict({
'charge': spaces.Discrete(100),
'system_checks': spaces.MultiBinary(10),
'job_status': spaces.Dict({
'task': spaces.Discrete(5),
'progress': spaces.Box(low=0, high=100, shape=()),
})
})
})
3.随机生成不重复的10个从1~10的整数
random.sample(range(0,10),10);# 随机生成重复的整数np.random.randint(0,10,size=10)
user_x = random.sample(range(0,10),10) #随机生成不重复的10个从1~10的整数random.sample(range(0,10),10)
user_y = random.sample(range(0,10),10) #随机生成不重复的10个从1~10的整数random.sample(range(0,10),10)
user_location=list(zip(user_x,user_y))
print(user_x,user_y)
print(user_location)
print(user_x[0],user_y[0])
#随机生成数字
""" a=random.randint(1,100)
print(a) """
user_num=5
sum=0
#生成质保固定的
for i in range(user_num):
a=random.randint(0,1)
sum+=a
print(a,sum)
4.列表中二维元组开方情况求距离
user_x = random.sample(range(0,10),10) #随机生成不重复的10个从1~10的整数random.sample(range(0,10),10)
user_y = random.sample(range(0,10),10) #随机生成不重复的10个从1~10的整数random.sample(range(0,10),10)
user_location=list(zip(user_x,user_y))
#开方有pow(x,y),sqrt ,math.hypot
p1=math.hypot((user_location[0][0]-user_location[1][0]),(user_location[0][1]-user_location[1][1]))
p=np.sqrt((user_location[0][0]-user_location[1][0])**2+(user_location[0][1]-user_location[1][1])**2)
print(user_x,user_y)
print(p,p1)
5.从列表中或数组中随机抽取固定数量的元素组成新的数组或列表
>>> import random
>>> mylist=list(range(1,10))
>>> mylist
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> newlist = random.sample(mylist, 3) #从mylist中随机获取3个元素
>>> newlist
[4, 7, 2]
6.numpy np.finfo()函数 eps max用法
finfo函数是根据括号中的类型来获得信息,获得符合这个类型的数型
import numpy as np
a=np.array([[1],[2],[-1],[0]])
b=np.maximum(a,np.finfo(np.float32).eps)
print(b)
[[1.0000000e+00]
[2.0000000e+00]
[1.1920929e-07]
[1.1920929e-07]]
ious = np.maximum(1.0 * inter_area / union_area, np.finfo(np.float32).eps)
eps是取非负的最小值。当计算的IOU为0或为负(但从代码上来看不太可能为负),使用np.finfo(np.float32).eps来替换
参考链接:https://www.freesion.com/article/6448186307/
7.列表形式转换成对角矩阵索引形式
7.1 scipy.linalg.block_diag()
如果环境中agent由多个对象组成,且每个对象都有其单独的转换矩阵,可以用scipy.linalg.block_diag()将多个矩阵合并为一个单独的对角矩阵,方便在step()中进行计算。我原本的方法是将每个对象保存的list中,list[i]对应第i个对象,这样容易造成step()中的代码过于冗长且要话费更多的计算时间,因为每次要调用多个对象时都需要写一个循环scipy.linalg.block_diag()
from scipy.linalg import block_diag
A = [[1, 0],
[0, 1]]
B = [[3, 4, 5],
[6, 7, 8]]
C = [[7]]
P = np.zeros((2, 0), dtype='int32')
block_diag(A, B, C)
array([[1, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[0, 0, 3, 4, 5, 0],
[0, 0, 6, 7, 8, 0],
[0, 0, 0, 0, 0, 7]])
block_diag(A, P, B, C)
array([[1, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0],
[0, 0, 3, 4, 5, 0],
[0, 0, 6, 7, 8, 0],
[0, 0, 0, 0, 0, 7]])
block_diag(1.0, [2, 3], [[4, 5], [6, 7]])
array([[ 1., 0., 0., 0., 0.],
[ 0., 2., 3., 0., 0.],
[ 0., 0., 0., 4., 5.],
[ 0., 0., 0., 6., 7.]])
7.2 numpy.ndarray.flatten
环境的observation如果需要的是一维向量,但是在step()中为了方便理解用的多维数组,可以使用obs.flatten()进行转换。
a = np.array([[1,2], [3,4]])
a.flatten()
array([1, 2, 3, 4])
a.flatten('F')
array([1, 3, 2, 4])
https://numpy.org/doc/stable/reference/generated/numpy.ndarray.flatten.html
8. for 循环简单写法
c = a if a>b else b 和下面等价 大于0就是真
a, b, c = 1, 2, 3
if a>b:
c = a
else:
c = b
c = (a>b and a or b)
c= [b, a][a > b] 都等价 推荐用第一个
【编写环境一】遇到常见python函数处理方式的更多相关文章
- Python函数知识点总结
1.函数的定义2.如何定义一个函数以及函数语法3.函数的调用4.函数的参数(形参,实参)以及参数的传递5.函数的返回值6.变量的作用域7.匿名函数8.嵌套函数和闭包9.装饰器10.函数思维导图 1.函 ...
- python常见的函数和类方法
在学python编程时 常常会遇到些常见的函数 记录学习 1. getattr函数 """ getattr() 函数用于返回一个对象属性值. 语法: getattr(ob ...
- python编写环境(种类)
python编写环境(种类) 官方推荐 cpython 转成C的字节码 jython转成Java的字节码 ironpython转成C#字节码 pypy转换成动态编译 开发快,运行快
- Python函数式编程(二):常见高级函数
一个函数的参数中有函数作为参数,这个函数就为高级函数. 下面学习几个常见高级函数. ---------------------------------------------------------- ...
- python 函数编写指南
#函数编写指南:1.给函数指定描述性名称,且只在其中是用小写字母和下划线 2.每个函数都应包含简要的阐述其功能的注释,该注释应紧跟在函数定义后面,且采用文档字符串格式 3.给形参指定默认值时,等号两边 ...
- python 函数的参数的几种类型
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了.对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解 ...
- 编写高质量代码--改善python程序的建议(三)
原文发表在我的博客主页,转载请注明出处! 建议十三:警惕eval()的安全漏洞 相信经常处理文本数据的同学对eval()一定是欲罢不能,他的使用非常简单: eval("1+1==2" ...
- 编写高质量代码--改善python程序的建议(七)
原文发表在我的博客主页,转载请注明出处! 建议三十四:掌握字符串的基本用法 编程有两件事,一件是处理数值,另一件是处理字符串,在商业应用编程来说,处理字符串的代码超过八成,所以需要重点掌握. 首先有个 ...
- 编写高质量代码--改善python程序的建议(四)
原文发表在我的博客主页,转载请注明出处! 建议十八:有节制的使用from...import语句 python提供了三种方式引入外部模块: import语句 from...import... __imp ...
- 编写高质量代码--改善python程序的建议(一)
原文发表在我的博客主页,转载请注明出处! 初衷 python是一个入门十分容易的编程语言,但是想要写好python却是一件不容易的事情,如果不是专业使用python的人,只是将python作为一个脚本 ...
随机推荐
- MMSC 扩充物料库存地点
当涉及到物料的库存地点时,系统通常会做校验,该物料是否扩充了库存地点,没有扩充则报错.为了不使这样的错误干扰到程序逻辑,通常会在涉及时,先查询MARD表,判断是否存在对应的库存地点.如果没有存在,则直 ...
- ElasticSearch 精确查询统计
ElasticSearch 精确查询统计 match_phrase:短语匹配,不分词 GET logback-2022-08/_search { "size": 1, //显示1条 ...
- 如何在iOS手机上查看应用日志
引言 在开发iOS应用过程中,查看应用日志是非常重要的一项工作.通过查看日志,我们可以了解应用程序运行时的状态和错误信息,帮助我们进行调试和排查问题.本文将介绍两种方法来查看iOS手机上的应用日志 ...
- C#开源跨平台的多功能Steam工具箱
前言 作为一名程序员你是否会经常会遇到GitHub无法访问(如下无法访问图片),或者是访问和下载源码时十分缓慢就像乌龟爬行一般.今天分享一款C#开源的.跨平台的多功能Steam工具箱和GitHub加速 ...
- Vue中如何使用sass实现换肤(更换主题)功能
Vue中如何使用sass实现换肤(更换主题)功能 https://blog.csdn.net/m0_37792354/article/details/82012278
- excel常用函数整理(可检索)
目录: 一.数字函数 1.1 sum 1.2 sumif 1.3 sumifs 1.4 sumproduct 1.5 abs二.统计函数 2.1 count 2.2 counta 2.3 counti ...
- Spring Boot Actuator 使用和常用配置
转载请注明出处: Spring Boot Actuator是Spring Boot提供的一个非常强大的工具,它可以帮助我们监控和管理我们的Spring Boot应用.Actuator提供了一系列的端点 ...
- AHB2APB设计
AHB2APB Bridge位置 AHB子系统时钟在200Mhz左右,APB时钟在几十Khz到几十Mhz 所以要进行跨时钟域处理,从AHB高时钟频率转到APB低时钟频率 AHB2APB Bridge规 ...
- 基于AHB_BUS的eflash控制器设计-02
基于AHB-BUS的eflash控制器设计 1.Flash Spec 1.1 地址映射 XADR是10bit?因为一共有1024行 每一行128byte容量,每次读取的粒度就是一个double wor ...
- MyBatis05——一对多和多对一处理
多对一处理 1.数据库表的设计 CREATE TABLE `teacher` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRI ...