1. python气象数据处理进阶之Xarray(6):数据重组与换形
这一部分涉及到了常用的操作,比如调换维度的位置,给数据重新reshape换形等等,建议大家可以认真阅读这部分。
老样子,先新建一个数组
比如说在求某个东西时需要将时间维放在最后一维,但是数据本身的时间在第一维,那么便可以用到这个操作。
第一种是精准换位,指定每个维度的位置
第二种是单独换位,只对指定维度换位,将time放在最后,其余不变
第三种为全部换位,相当于数组转置
扩展指增加一个维度,压缩指将一个维度挤压掉
官方文档中接下来有一段是关于DataArray向DataSet转换的,个人感觉放在这一章节并不合理,我后边会整理放进Python气象数据处理进阶之Xarray(1)中(我觉得两种基础数据结构以及互相转换应该最开始介绍的)。所以接下来跳过这部分。
个人感觉可能处理站点数据会用到这个方法
换一个数组演示
现在将这个2维数组堆叠成1维
也可以拆分,其实就是反堆叠
最重要的是不同于Pandas,Xarray的stack不缺自动丢失缺测值!!!
Xarray还提供了将不同变量stack的例子,有兴趣的可以去看看。这个用法感觉比较鸡肋
这块比较难理解,建议还是先读第一篇文章,弄清数据结构,da数组显示Dimensions without coordinates: x,而通过da.set_index函数,将X设置为混合索引号。
之后便可以实线自由索引:
通过mda.reset_index('x')重置。
reorder_levels()函数允许调换索引顺序(个人感觉比较鸡肋)
这小节应该是这篇文章和数组换形换维同等重要的。
这就是对数组进行滚动。这个的作用主要在于做差分计算。虽然前边讲过Xarray提供了中央差计算函数,但是仍需要更灵活的操作,滚动函数就实现了这个目的。
2. python怎么修改某个内存地址的数据
使用ctypes模块调用WriteProcessMemory函数,在创建程序进程后,就可以修改该程序指定内存地址。WriteProcessMemory的函数原型如下所示。
BOOL WriteProcessMemory(
HANDLE hProcess,
LPVOID lpBaseAddress,
LPCVOID lpBuffer,
SIZE_T nSize,
SIZE_T* lpNumberOfBytesWritten
);
其参数含义如下。
· hProcess:要写内存的进程句柄。
· lpBaseAddress:要写的内存起始地址。
· lpBuffer:写入值的地址。
· nSize:写入值的大小。
· lpNumberOfBytesWritten :实际写入的大小。
python代码示例如下:
fromctypesimport*
#定义_PROCESS_INFORMATION结构体
class_PROCESS_INFORMATION(Structure):
_fields_=[('hProcess',c_void_p),
('hThread',c_void_p),
('dwProcessId',c_ulong),
('dwThreadId',c_ulong)]
#定义_STARTUPINFO结构体
class_STARTUPINFO(Structure):
_fields_=[('cb',c_ulong),
('lpReserved',c_char_p),
('lpDesktop',c_char_p),
('lpTitle',c_char_p),
('dwX',c_ulong),
('dwY',c_ulong),
('dwXSize',c_ulong),
('dwYSize',c_ulong),
('dwXCountChars',c_ulong),
('dwYCountChars',c_ulong),
('dwFillAttribute',c_ulong),
('dwFlags',c_ulong),
('wShowWindow',c_ushort),
('cbReserved2',c_ushort),
('lpReserved2',c_char_p),
('hStdInput',c_ulong),
('hStdOutput',c_ulong),
('hStdError',c_ulong)]
NORMAL_PRIORITY_CLASS=0x00000020#定义NORMAL_PRIORITY_CLASS
kernel32=windll.LoadLibrary("kernel32.dll")#加载kernel32.dll
CreateProcess=kernel32.CreateProcessA#获得CreateProcess函数地址
ReadProcessMemory=kernel32.ReadProcessMemory#获得ReadProcessMemory函数地址
WriteProcessMemory=kernel32.WriteProcessMemory#获得WriteProcessMemory函数地址
TerminateProcess=kernel32.TerminateProcess
#声明结构体
ProcessInfo=_PROCESS_INFORMATION()
StartupInfo=_STARTUPINFO()
file='ModifyMe.exe'#要进行修改的文件
address=0x0040103c#要修改的内存地址
buffer=c_char_p("_")#缓冲区地址
bytesRead=c_ulong(0)#读入的字节数
bufferSize=len(buffer.value)#缓冲区大小
#创建进程
ifCreateProcess(file,0,0,0,0,NORMAL_PRIORITY_CLASS,0,0,byref(StartupInfo),byref(ProcessInfo)):
#读取要修改的内存地址,以判断是否是要修改的文件
ifReadProcessMemory(ProcessInfo.hProcess,address,buffer,bufferSize,byref(bytesRead)):
ifbuffer.value=='x74':
buffer.value='x75'#修改缓冲区内的值,将其写入内存
#修改内存
ifWriteProcessMemory(ProcessInfo.hProcess,address,buffer,bufferSize,byref(bytesRead)):
print'成功改写内存!'
else:
print'写内存错误!'
else:
print'打开了错误的文件!'
TerminateProcess(ProcessInfo.hProcess,0)#如果不是要修改的文件,则终止进程
else:
print'读内存错误!'
else:
print'不能创建进程!'