ENVI_IDL: 基础语法详解

2023-11-02

01 题目

 

02 代码说明

题目本身很简单,但是我自己加了一些东西进去增加难度。主要包括print函数的封装、格式化字符串,但是不影响代码的阅读。(注:对于没有语言基础的人而言相对阅读困难,但是由于IDL是解释型语言,类似于Python,所以难度不会太难)

提示:

findgen(3, 4, start=2): 定义3列4行的索引数组(先列后行),第一个数组元素值默认为0,这里start为2,故从2开始;
 

b = 3s:定义整型变量,s可不写;


c = [3]:定义仅有一个元素的数组,该元素值为3;

d = [9, 3, 1]:定义含多个元素的数组;

+:原本只能进行数值之间的运算,这里进行了重载使得可以进行字符串的连接,类似于python;

string(a[3, 4], format='(f5.2)'):格式化输出,输出的变量转为浮点型,总宽度为5(小数点也算一个宽度),小数位宽度为2.

string(a[3, 4], format='%.2f'):格式化输出,或许已经发现了,前面的format实际上是fortran语言的格式化输出样式,但是我不太了解该语言所以用不顺手,我更倾向于C语言的格式化的输出(Yeah,IDL支持C语言和Fortran两种的语言的格式化输出<绝大部分一致>)。这里的含义与上一致,具体百度C语言格式化输出即可;

&:这是一个连续化符,用于将多个操作或者指令放在一行执行;

a = [[3, 9, 10], [2, 7, 5], [4, 1, 6]]: 这是自定义一个二维数组,注意,数组的定义均是使用中括号[],高维亦是如此;


printArray:这是定义的一个函数(详见下文),其中的arr是位置参数,prefix,format都是关键字参数;

dims = size(arr, /dimensions):获取数组arr的维度信息(以数组形式返回);

strcompress():返回传入的字符串的副本,这个副本是将原来的字符串中的所有的空白字符和制表符全部换成了一个空白字符或者直接全部移除。自己多用多体会就清楚了。

gt, ge, lt, le, ne, eq:这些很简单,就是大于(greater than, gt),大于等于(greater than or equal, ge),小于(less than,lt),小于等于(less than or equal, le),等于(equal,eq)。比较运算符。

+,-,*,/,^, mod:^是次方数,例如2的8次方就是2 ^ 8,mod是取余运算,例如9 mod 2 等于1.

float():强制转换符,将其他数据类型转换为浮点型。

write_tiff,'D:\Objects\JuniorFallTerm\IDLProgram\Project\ExperimentsMe\Week1\Data\temp.tif', img, /float:第一个参数传入路径名称(\和/都行,但是后面的HDF读取内部数据集的路径只允许/因此建议都用/会更好)。第二个参数传入需要写入的数组。另外如果不传入参数/float那么write_tiff函数默认以整型写入(尽管数组的数据类型为浮点型)。

; @Author: ChaoQiezi
; @Email: chaoqiezi.one@qq.com
; @Time: 2023-09-11

; This script is used to basic practice

; This function is used to print array
function  printArray, arr, prefix=prefix, format=format
    dims = size(arr, /dimensions)
    if  n_elements(prefix) then print, prefix
    if ~n_elements(format) then format='%.2f'
    
    for row = 0, dims[1] - 1 do begin
        arr_row = arr[*, row]
        formatted_row = strcompress(string(arr_row, format=format))
        
        output = '      '
        for col = 0, dims[0] - 1 do begin
            output += formatted_row[col]
            if col ne dims[0] - 1 then output += ', '
        endfor
        
        print, output
    endfor
end

pro basic_pracitce
    ; question-1
    a = findgen(4, 6)  ; define the index array(float)
    b = 3s  ; define the int var
    c = [3]  ; define the array
    d = [9, 3, 1]
    print, 'the value for col 3 and row 4 is: ' + string(a[3, 4], format='%.2f')
    print, 'the value with index 15: ' + string(a[15], format='%.2f')
    printArray, a + b, PREFIX='a plus b is equal to: '
    print, 'a[1, 1] plus b is equal to: ' + string(a[1, 1] + b, format='%.2f')
    print, 'a plus b is equal to: ', a + c & help, a + c
    print, 'a plus c is equal to: ', a + d & help, a + d
    
    ; question2
    a = [[3, 9, 10], [2, 7, 5], [4, 1, 6]]
    b = [[7, 10, 2], [5, 8, 9], [3, 1, 6]]
    printArray, a + b, prefix='a plus b is equal: ' 
    printArray, a * b, prefix='a times b is equal to: '
    
    ; question3
    a = [[0, 5, 3], [4, 0, 2], [0, 7, 8]]
    b = [[0, 0, 1], [9, 7, 4], [1, 0, 2]]
    printArray, (a gt 3) * a, prefix='keep the result greater than 3 in a, and set all the rest to 0: '
    printArray, (b le 4) * b + (b gt 4) * 9, prefix='keep the result less than or equal to 3 in ' + $
        'a, and set all the rest to 9: ', format='%i'
    printArray, (a + b) / 2.0, prefix='calculate the mean of a and b: '
    printArray, ((a ne 0) and (b ne 0)) * ((a + b) / 2.0)+ (a eq 0) * b + (b eq 0) * a, $
        prefix='calculate the mean of a and b, and 0 values are not included in the calculation: '
    print, (a + b) / float((a ne 0) + (b ne 0))  ; equal above and simple    
    
    ; question4
    img = findgen(1024, 1024)
;    image(img, /order)
    write_tiff, 'D:\Objects\JuniorFallTerm\IDLProgram\Project\ExperimentsMe\Week1\Data\temp.tif', img, /float
end

03 其它

可以尝试将函数printArray的定义修改为(仅仅是function修改为pro):
 

pro  printArray, arr, prefix=prefix, format=format
    dims = size(arr, /dimensions)
    if  n_elements(prefix) then print, prefix
    if ~n_elements(format) then format='%.2f'
    
    for row = 0, dims[1] - 1 do begin
        arr_row = arr[*, row]
        formatted_row = strcompress(string(arr_row, format=format))
        
        output = '      '
        for col = 0, dims[0] - 1 do begin
            output += formatted_row[col]
            if col ne dims[0] - 1 then output += ', '
        endfor
        
        print, output
    endfor
end

整个程序仍然可以运行,像这样的话我们就清楚了我们pro文件可以包含多个子程序(多个pro过程),但是我们的pro文件从哪个子pro程序开始运行呢?这就与我们当初pro文件的命名相关,pro文件将与pro文件名一致的子pro程序作为类似main的入口进入顺序运行。
 

另外,ENVI IDL支持python代码的运行,例如:

其他详见帮助,IDL版本过旧可能不支持,IDL85貌似支持Python3.8以下,因为我目前是IDL8.5,Python3.8.

04 Python代码实现

比较简单,暂无解释

# @Author   : ChaoQiezi
# @Time     : 2023-09-12  23:20
# @Email    : chaoqiezi.one@qq.com

"""
This script is used to learn basic grammar of python.
"""

import numpy as np
from osgeo import gdal

# 第一问
def question1():
    a = np.arange(24, dtype=np.float32).reshape(6, 4)
    b = 3
    c = np.array([3])
    d = np.array([9, 3, 1])
    print(a[4, 3])  # 取第3列第4行的数值
    print(a.flatten()[15])  # 取第15个索引的数值
    print(a + b)
    print(a[1, 1] + b)  # 8.0
    print(a + c)  # 与IDL结果不一致, 这是因为c是一维数组, 会自动广播
    # print(a + d)  # 直接报错, 维度不一致


# 第二问
def question2():
    a = np.array([[3, 9, 10], [2, 7, 5], [4, 1, 6]])
    b = np.array([[7, 10, 2], [5, 8, 9], [3, 1, 6]])
    print(a + b)
    print(a * b)

# 第三问
def question3():
    a = np.array([[0, 5, 3], [4, 0, 2], [0, 7, 8]])
    b = np.array([[0, 0, 1], [9, 7, 4], [1, 0, 2]])
    # 取a大于3的结果,其余为0
    print((a > 3) * a)  # or this
    print(np.where(a > 3, a, 0))
    # 取b中小于等于4的结果,其余为9
    print((a <= 4) * a + (a > 4) * 9)
    print(np.where(a <= 4, a, 9))
    # 计算A和B的均值
    print((a + b) / 2)
    print(np.mean(a + b))  # or this
    # 计算A和B的均值, 0不纳入计算
    print((a + b) / ((a > 0) + (b > 0)))


def write_tiff(out_path: str, data: np.ndarray):
    driver = gdal.GetDriverByName('GTiff')
    out_ds = driver.Create(out_path, data.shape[1], data.shape[0], 1, gdal.GDT_Float32)  # col, row
    out_ds.GetRasterBand(1).WriteArray(data)
    out_ds.FlushCache()
    del out_ds

def question4():
    a = np.arange(1024*1024, dtype=np.float32).reshape(1024, 1024)
    write_tiff(r'D:\Objects\JuniorFallTerm\IDLProgram\Project\PyExperiments\Experiments\week1\temp.tiff', a)


if __name__ == '__main__':
    question1()
    question2()
    question3()
    question4()

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ENVI_IDL: 基础语法详解 的相关文章

  • 如何查看Databricks中的所有数据库和表

    我想列出 Azure Databricks 中每个数据库中的所有表 所以我希望输出看起来像这样 Database Table name Database1 Table 1 Database1 Table 2 Database1 Table
  • Python:在列表理解本身中引用列表理解?

    这个想法刚刚出现在我的脑海中 假设您出于某种原因想要通过 Python 中的列表理解来获取列表的唯一元素 i if i in created comprehension else 0 for i in 1 2 1 2 3 1 2 0 0 3
  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 基于代理的模拟:性能问题:Python vs NetLogo & Repast

    我正在 Python 3 中复制一小段 Sugarscape 代理模拟模型 我发现我的代码的性能比 NetLogo 慢约 3 倍 这可能是我的代码的问题 还是Python的固有限制 显然 这只是代码的一个片段 但 Python 却花费了三分
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • .net core 在ubuntu系统下保存图片到本地

    这就是一个坑 using MemoryStream ms new MemoryStream imgBts using Image img Image FromStream ms img Save tempPic jpg 原来在 net Fr
  • 12关于FFmpeg的四种时基和时基相关函数的分析及其场景用法

    12关于FFmpeg的四种时基和时基相关函数的分析及其场景用法 前言 AVRational类型 是一个分数 例如 1 25 表示1除以25即1 25 时基 时间的单位 在ffmpeg下被描述成时基 时间戳 某个时刻的时间 1 FFmpeg的
  • vs更换本地git账号

    有人认为vs中用的git账号是哪个无所谓 其实不然 git账号不同 访问的权限就不一样 那么如果想跟换git账号该怎么做呢 win7 控制面板 gt 用户帐户和家庭安全 gt 凭据管理器 编辑普通凭据中的git账号或者直接删除 然后重启vs
  • 响应式布局 与 Bootstrap

    一 响应式布局 1 什么是响应式布局 使用媒体查询针对不同宽度的设备进行布局和样式设置 从而实现适配不同设备的目的 2 响应式布局的容器 响应式需要一个父级做为布局容器 来配合子级元素来实现变化效果 原理就是在不同屏幕下 通过媒体查询来改变
  • configure移植技巧,绝对干货

    一 环境 主机 ubuntu 开发板 arm linux 二 configure分析 build host target介绍 build为主机环境 如ubuntu redhat等等 执行gcc v命令可以查看到Target变量 build
  • 【STM32+cubemx】0015 HAL库开发:内部flash读写

    本节我们来学习stm32内部flash的读写 在某些应用中 我们需要保存少量掉电仍然不丢失的数据 而在电路板上额外增加一块eeprom或者flash又太浪费硬件资源 这时我们就可以把这些数据保存在stm32内部的flash里 1 stm32
  • debian11 安装 postgress 数据库 -- chatGPT

    问 debian 安装 postgress 数据库 gpt 要在Debian上安装PostgreSQL数据库 您可以按照以下步骤进行操作 1 打开终端 您可以通过点击 应用程序 菜单 然后在 系统工具 或 终端 下找到终端应用程序 2 使用
  • 【100天精通Python】Day43:Python网络爬虫开发_爬虫基础(urlib库、Beautiful Soup库、使用代理+实战代码)

    目录 1 urlib 库 2 Beautiful Soup库 3 使用代理 3 1 代理种类 HTTP HTTPS 和 SOCKS5 3 2 使用 urllib 和 requests 库使用代理
  • 推荐一波Git学习资料

    关于Git的用法我们已经写七篇文章 介绍了Git的不少用法 这些足以应付工作中90 的需求了 剩下的10 就需要小伙伴们在工作中自己慢慢总结了 我这里再给小伙伴们推荐一点Git学习资料 为我们的Git系列画上一个句号 书 推荐两本个人觉得很
  • 2018第八届至2022年第十三届蓝桥杯单片机开放与设计省赛客观题及简解整理

    前言 由于本人马上要参加第十四届蓝桥杯单片机设计与开发的省赛了 在对客观题复习两轮后 发现效率是比较低的 因此整理了2018至2022年的省赛客观题 将大概的考点划分三部分 这样可以更加系统的复习其内容 现在把整理的这份内容分享给各位同学
  • 微信小程序的this.setData()方法更新二级属性数据

    在用this setData 更新数据时 如果要更新的数据如下 data person name xiaoming occupation front end engineer 要把person name更新为 xiaogang 我们如果通过
  • ElementUI 之 el-tabs添加自定义按钮

  • oauth2 jwt token 返回accessToken对象中携带用户字段信息

    oauth2 源码中用户信息只返回用户名称 现有需求要求返回userId 只能重写某些方法 server端和client端都要修改 方法一 结果 userId 封装在token中 需要解析access token才能看到 但是经测试发现 使
  • 【Java基础】Scanner中next与nextLine区别

    Scanner概念 scanner可以用来获取用户的输入 八个基本数据类型除字符外都可以输入 另外输入字符串有两种方式next与nextLine 接下来介绍他们的区别 1 next与nextLine的区别 1 1 区别一 String st
  • 上传AppStore 报错 ERRPR ITMS-90700

    小萌在解决乱七八糟的警告的时候 加入了Background Modes 然后就报了上述错误 把这个去掉之后重新打包 然后就顺利上线了
  • win10上python3密码库pycryptodome使用

    环境安装 python 在 Windows下使用密码库时要安装的是pycryptodome模块 pip install pycryptodome python 在 Linux下使用密码库时要安装的是pycrypto模块 pip instal
  • C/C++中字符串数组及strlen()和sizeof()区别

    1 字符串数组 标准C语言中没有字符串 string 类型 而只是在C 后添加了字符串string类 但是并不属于基础数据类型 只是类功能很强大 得到广泛应用 所以一般我们平时处理字符串 即字符序列 使用的都是字符串数组 1 1 字符串数组
  • 提升企业网络安全的重要性:EventLog Analyzer的角色

    在今天的数字时代 企业对网络安全的需求愈发迫切 随着互联网的不断发展和企业信息的数字化 网络攻击的威胁也不断增加 为了保护企业数据和系统的完整性 网络安全已经成为每个企业都必须认真对待的重要问题 在这个背景下 我们不得不提到一种强大的工具
  • SSM+mysql课程题库管理系统-计算机毕业设计源码18655

    摘 要 随着科学技术的飞速发展 各行各业都在努力与现代先进技术接轨 通过科技手段提高自身的优势 对于课程题库管理系统当然也不能排除在外 随着网络技术的不断成熟 带动了课程题库管理系统 它彻底改变了过去传统的管理方式 不仅使服务管理难度变低了
  • ENVI_IDL: 基础语法详解

    01 题目 02 代码说明 题目本身很简单 但是我自己加了一些东西进去增加难度 主要包括print函数的封装 格式化字符串 但是不影响代码的阅读 注 对于没有语言基础的人而言相对阅读困难 但是由于IDL是解释型语言 类似于Python 所以