-
前言正则表达式,这个看起来像密林中的迷宫的工具,既神秘又令人着迷。它是编程世界中的一门魔法,有着神奇的能力。你是否曾经在寻找或解析文本时感到束手无策?或许你想要从海量数据中提取特定信息?这正是正则表达式可以派上用场的时候。本文将带你探索这个神奇的工具,从入门到高级,帮助你驾驭它,解密你的数据。第一: 什么是正则表达式?正则表达式,也被称为正则表达式或正则模式,是一种用于匹配文本模式的工具。它是一个强大的文本处理工具,允许你根据特定模式来搜索、替换和提取文本数据。正则表达式可以用于多种编程语言和文本处理工具,如Python、JavaScript、Perl、以及文本编辑器中的查找与替换功能。正则表达式的基本语法包括以下元字符和模式:字面文本字符: 通常,正则表达式由字面文本字符组成,它们精确匹配输入文本中的相应字符。例如,正则表达式 abc 将匹配输入文本中的字符 “abc”。元字符: 正则表达式中的元字符具有特殊含义,用于定义匹配模式。一些常见的元字符包括:.:匹配任何字符(除了换行符)。*:匹配前一个字符的零个或多个实例。+:匹配前一个字符的一个或多个实例。?:匹配前一个字符的零个或一个实例。^:匹配字符串的开头。$:匹配字符串的结尾。[]:用于定义字符类,匹配其中的任何一个字符。():用于分组,以便对表达式的一部分应用其他元字符。转义字符: 如果要匹配元字符本身,需要使用反斜杠 \ 进行转义。例如,\. 匹配实际的句点字符。量词: 量词用于指定匹配的重复次数,如 {n}(精确匹配 n 次)、{n,}(至少匹配 n 次)、{n,m}(匹配 n 到 m 次)。特殊字符: 正则表达式还包含一些特殊字符,如 \d(匹配数字)、\w(匹配字母、数字或下划线)、\s(匹配空白字符)。正则表达式的语法和功能非常广泛,这里提到的是一些基本的概念。你可以根据需要进一步学习和使用正则表达式,以实现各种文本处理任务。在代码中,通常会使用字符串前缀 r 表示原始字符串,以避免反斜杠的转义。例如,r'\d+' 表示匹配一个或多个数字。第二: 字符匹配和量词:当使用正则表达式进行文本匹配时,你可以使用字符匹配和量词来指定匹配字符、数字、空格等,以及控制匹配多个字符的次数。此外,你还可以使用贪婪匹配和非贪婪匹配来控制匹配的行为。1. 字符匹配:\d:匹配任何数字(0-9)。\D:匹配任何非数字字符。\w:匹配字母、数字或下划线(单词字符)。\W:匹配任何非单词字符。\s:匹配空白字符,包括空格、制表符和换行符。\S:匹配非空白字符。示例:\d 匹配任何数字字符。\w+ 匹配一个或多个连续的字母、数字或下划线字符。\s* 匹配零个或多个连续的空白字符。2. 量词:*:匹配前一个字符的零个或多个实例。+:匹配前一个字符的一个或多个实例。?:匹配前一个字符的零个或一个实例。{n}:精确匹配前一个字符的 n 次。{n,}:匹配前一个字符至少 n 次。{n,m}:匹配前一个字符 n 到 m 次。示例:\d{3} 匹配连续的三个数字。\w{2,5} 匹配连续的字母、数字或下划线字符,其长度在2到5之间。\s? 匹配零个或一个空白字符。3. 贪婪和非贪婪匹配:贪婪匹配是默认行为,它会尽可能多地匹配字符。非贪婪匹配使用 *?、+?、?? 这样的量词后缀,使匹配尽可能少的字符。示例:对于字符串 "123456", 贪婪匹配 (\d+)* 会匹配整个字符串,而非贪婪匹配 (\d+?)* 会匹配每个数字。这些是正则表达式中用于字符匹配和量词的基本概念。你可以根据具体的需求使用这些元字符和量词来构建正则表达式,以实现不同的文本匹配和提取操作。请记住,正则表达式的具体语法和行为可能会根据使用的编程语言或工具而有所不同,因此需要查看相关文档以获取更多详细信息。第三:字符类和元字符字符类和元字符是正则表达式中的重要概念,它们用于匹配字符范围和具有特殊含义的字符。下面是关于字符类和特殊元字符的介绍:1. 字符类:[...]:字符类用于匹配一个字符范围中的任何一个字符。在方括号内,你可以列出希望匹配的字符,例如 [aeiou] 可以匹配任何一个元音字母。也可以使用短划线表示范围,比如 [0-9] 匹配任何数字。[^...]:在字符类的开头使用脱字符 ^,它表示反向匹配,即匹配除了指定字符范围内的字符之外的所有字符。示例:[aeiou] 匹配任何一个元音字母。[A-Za-z] 匹配任何一个英文字母。[^0-9] 匹配任何非数字字符。2. 特殊元字符:.:匹配除换行符之外的任何字符。例如,a.c 可以匹配 “abc”、“a1c” 等。^:匹配字符串的开头,用于限定匹配从字符串开始的部分。$:匹配字符串的结尾,用于限定匹配到字符串结束的部分。|:用于表示或操作,例如 A|B 匹配 “A” 或 “B”。():用于分组,可以改变操作符的优先级,也可以捕获匹配的内容。*:匹配前一个字符的零个或多个实例。+:匹配前一个字符的一个或多个实例。?:匹配前一个字符的零个或一个实例。示例:^A 匹配以 “A” 开头的字符串。abc|def 匹配 “abc” 或 “def”。(abc)+ 匹配连续多个 “abc”。\d+ 匹配一个或多个数字。这些特殊元字符和字符类提供了强大的匹配和搜索功能,允许你构建更复杂的正则表达式以匹配文本中的不同模式。记住,正则表达式的具体语法和特殊元字符可能因编程语言和工具的不同而有所变化,因此需要查看相关文档以获取详细信息。第四:边界匹配边界匹配是正则表达式中的一项重要功能,它允许你限定匹配发生在字符串的开始、结束或单词边界上。下面是关于边界匹配的两个常用概念:1. 开始和结束的边界:^:在正则表达式中使用 ^ 来匹配字符串的开始。例如,正则表达式 ^Hello 将匹配以 “Hello” 开头的字符串。$:使用 $ 来匹配字符串的结束。例如,正则表达式 World$ 将匹配以 “World” 结尾的字符串。示例:^Start 匹配以 “Start” 开头的字符串。End$ 匹配以 “End” 结尾的字符串。2. 单词边界:\b:单词边界是一个特殊的元字符,用于匹配单词的边界。它不匹配字符,而是匹配字符与非字符之间的位置。例如,\bword\b 只匹配独立的 “word” 单词,而不匹配 “words” 中的 “word” 部分。\B:与 \b 相反,\B 匹配非单词边界的位置。例如,\Bword\B 可以用来匹配嵌入在其他单词中的 “word”。示例:\bhello\b 匹配独立的 “hello”,不匹配 “helloworld” 中的 “hello”。\Bword\B 匹配嵌入在其他字符中的 “word”,例如 “myword” 中的 “word”。边界匹配非常有用,因为它允许你明确指定匹配发生的位置,以防止不必要的匹配。这对于在文本中查找完整的单词或确保匹配位于字符串的特定位置非常有用。第五:分组和匹配分组和捕获是正则表达式中强大的功能,允许你将模式分组并从匹配的文本中提取子字符串。这对于处理复杂的文本匹配任务非常有用。1. 使用括号进行分组:( ... ):括号用于将模式分组,可以包含一个或多个字符或子模式。这允许你对子模式应用量词、元字符等。|:竖线用于创建多个分组的选择,类似于逻辑或。例如,(apple|banana) 匹配 “apple” 或 “banana”。示例:(abc)+ 匹配连续多个 “abc”。(red|green|blue) 匹配 “red”、“green” 或 “blue”。(\d{2,4})-(\d{2})-(\d{2}) 匹配日期格式,例如 “2023-10-18”,并将年、月、日分别放入不同的捕获组。2. 提取匹配的子字符串:当使用括号进行分组时,你可以捕获匹配的子字符串以供后续处理。使用捕获组编号来提取子字符串。通常,编号从 1 开始,按括号的左括号出现的顺序递增。在许多编程语言中,你可以通过 \1、\2 等来引用捕获组中的内容。示例:假设正则表达式为 (\d{2})-(\d{2})-(\d{4}),对于字符串 “18-10-2023”,可以通过 \1 获取日,\2 获取月,\3 获取年。在Python中,你可以使用 re 模块的 match 或 search 函数来提取捕获组中的内容。 import re pattern = r'(\d{2})-(\d{2})-(\d{4})' text = '18-10-2023' match = re.search(pattern, text) if match: day = match.group(1) month = match.group(2) year = match.group(3) 分组和捕获允许你更灵活地处理匹配的文本,将特定部分提取出来以便进一步操作,如数据处理、替换等。这在文本处理和数据提取任务中非常有用。第六:正则表达式在编程中的应用:正则表达式在编程中有广泛的应用,包括在文本编辑器中查找替换操作和在编程语言中的使用。以下是它们的具体应用:在文本编辑器中查找和替换:查找文本: 文本编辑器通常提供正则表达式搜索功能,允许用户使用正则表达式来查找文本文件中的特定模式。这对于大规模的文本处理和搜索非常有用。替换文本: 正则表达式还可用于文本替换操作。你可以使用正则表达式来搜索匹配模式,并用指定的文本替换它们。这对于批量文本替换、格式规范化等任务非常实用。在编程语言中的使用:字符串操作: 编程语言通常内置对正则表达式的支持,允许你在字符串中进行匹配、搜索和提取操作。这对于处理用户输入、解析数据、验证格式等任务非常有用。数据提取: 你可以使用正则表达式来从文本数据中提取有用的信息,如日期、电子邮件地址、URL、电话号码等。这在数据挖掘和文本分析中经常用到。数据验证: 正则表达式可以用于验证输入的格式是否符合要求。例如,验证密码强度、身份证号码的格式等。文本处理: 正则表达式可用于文本处理任务,如分词、词干提取、删除空白字符等。日志分析: 在日志文件中,正则表达式可用于筛选出特定类型的日志条目,以进行分析和报告生成。网页爬虫: 在网页爬虫开发中,正则表达式可用于从网页源代码中提取所需的信息,如链接、标题、价格等。不同编程语言对正则表达式的支持略有不同,但通常都提供了相似的功能,例如在Python中,你可以使用re模块,而在JavaScript中,你可以使用内置的正则表达式功能。正则表达式是处理文本和数据的有力工具,但也需要谨慎使用,因为复杂的正则表达式可能会变得难以理解和维护。第七:常见正则表达式示例以下是一些常见的正则表达式示例,以及它们的用途:匹配Email地址:正则表达式:[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}用途:用于验证和提取电子邮件地址。匹配URL:正则表达式:https?://\S+用途:用于从文本中提取URL。匹配日期:正则表达式:\d{2}/\d{2}/\d{4}用途:用于识别和提取日期格式。匹配IP地址:正则表达式:\b(?:\d{1,3}\.){3}\d{1,3}\b用途:用于验证和提取IP地址。匹配HTML标签:正则表达式:<[^>]+>用途:用于从HTML文本中提取标签或删除标签。匹配电话号码:正则表达式:\d{3}-\d{3}-\d{4}用途:用于验证和提取电话号码。匹配空白行:正则表达式:^\s*$用途:用于查找或删除空白行。这些示例只是冰山一角,正则表达式可以根据具体的需求变得更复杂。在使用正则表达式时,始终要谨慎测试和验证,以确保其按预期工作,特别是在处理用户输入或敏感数据时。第八:正则表达式的高级用法正则表达式的高级用法包括向前向后查看以及结合自定义函数的应用。这些功能提供了更复杂和灵活的文本处理和匹配能力。1. 向前向后查看(Lookahead and Lookbehind):向前查看:(?=...),它用于匹配满足某个条件的位置,但不包括这个条件本身。例如,(?=\d) 可以匹配后面跟着一个数字的位置。向后查看:(?<=...),它用于匹配位于某个条件之前的位置,但不包括这个条件本身。例如,(?<=\d) 可以匹配前面有一个数字的位置。负向前查看:(?!...),用于匹配不满足某个条件的位置。例如,(?!\d) 可以匹配后面不是数字的位置。负向后查看:(?<!...),用于匹配不位于某个条件之前的位置。例如,(?<!\d) 可以匹配前面不是数字的位置。这些向前和向后查看功能非常有用,因为它们允许你匹配特定位置而不捕获实际的字符。这对于复杂的匹配和排除情况非常有帮助。2. 自定义函数:有些编程语言允许你结合自定义函数与正则表达式一起使用。例如,Python的re模块中的re.sub()函数可以接受一个自定义函数作为替换参数。你可以在自定义函数中根据匹配的内容执行特定的操作,然后返回替代文本。示例(Python): import re def custom_replace(match): matched_text = match.group(0) # 在这里执行自定义操作,例如将匹配的文本转为大写 return matched_text.upper() text = "hello world" pattern = r'\b\w+\b' result = re.sub(pattern, custom_replace, text) print(result) # 输出: "HELLO WORLD" 自定义函数结合正则表达式提供了非常灵活的文本处理能力,你可以根据匹配情况执行各种自定义操作。这些高级功能扩展了正则表达式的应用范围,允许你更精确地控制文本处理,但也需要更深入的理解和实践。在实际使用中,它们通常用于解决特定的复杂文本处理问题。第九:常见错误和调试:在编写正则表达式时,常常会出现一些错误。以下是一些常见的正则表达式错误以及调试工具和技巧,帮助你找到和修复这些问题:常见的正则表达式错误:语法错误: 正则表达式的语法非常严格,小错误可能导致匹配失败。例如,未转义特殊字符或未关闭括号。贪婪匹配错误: 默认情况下,正则表达式是贪婪的,可能匹配更多字符,导致意外的结果。在量词后加上 ? 可以将其改为非贪婪匹配。字符范围错误: 在字符类中,如果未正确定义字符范围,可能会导致不符预期的匹配。调试工具和技巧:在线正则表达式测试器: 有许多在线工具可用于测试正则表达式。你可以输入正则表达式和文本,然后查看匹配结果,如RegExr、Regex101等。正则表达式编辑器: 许多文本编辑器和集成开发环境(IDE)具有内置的正则表达式支持,包括语法高亮和测试功能。日志输出: 在调试时,可以将匹配的文本和捕获组的内容输出到日志文件,以查看正则表达式的实际效果。逐步调试: 如果正则表达式非常复杂,可以逐步构建和测试它。将正则表达式分成多个小部分,逐步添加和测试,以确保每个部分按预期工作。学习文档: 学习正则表达式的官方文档,了解不同编程语言和工具的正则表达式规则和支持。练习: 练习编写正则表达式是掌握它的关键。有许多在线练习网站,如RegexOne,提供了练习的机会。没有考虑边界: 未正确处理边界情况,可能会导致匹配到不应该匹配的部分。忘记转义: 特殊字符需要转义,例如句点 . 应该用 \. 来匹配实际的句点字符。匹配单词:正则表达式:\b\w+\b用途:用于提取文本中的单词。匹配十六进制颜色代码:正则表达式:#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})用途:用于验证和提取HTML颜色代码。匹配身份证号码:正则表达式:\d{17}[\dXx]用途:用于验证和提取身份证号码。
-
property() 函数概述参数说明示例代码2. 使用装饰器语法创建属性3. 只读属性4. 计算属性5. 删除属性应用场景1. 数据封装与保护2. 属性计算与逻辑处理编写高级 getter 和 setter 方法1. 高级 getter 方法2. 高级 setter 方法结合静态方法和类方法1. 结合静态方法2. 结合类方法高级应用场景1. 对象属性的验证和控制2. 访问控制和权限管理总结在 Python 中,property() 函数是一个强大的内置函数,用于创建可管理的属性,它允许我们在访问或修改对象的属性时执行自定义的操作。本文将深入探讨 property() 函数的各种用法、参数及示例,以帮助更好地理解和应用这一函数。property() 函数概述property() 函数用于创建一个属性,并指定相应的 getter、setter 和 deleter 方法。它的语法如下:1property(fget=None, fset=None, fdel=None, doc=None)其中,fget、fset 和 fdel 分别是用于获取、设置和删除属性值的方法。这些方法可以是函数、方法或 lambda 表达式。如果省略了某个方法,则表示该属性对应的操作不可用。参数说明1. fgetfget 参数是一个用于获取属性值的方法(getter)。当访问属性时,fget 方法会被调用,并返回属性的值。2. fsetfset 参数是一个用于设置属性值的方法(setter)。当为属性赋值时,fset 方法会被调用,并执行相应的操作。3. fdelfdel 参数是一个用于删除属性值的方法(deleter)。当删除属性时,fdel 方法会被调用,并执行相应的操作。4. docdoc 参数是一个可选的字符串,用于指定属性的文档字符串(docstring)。示例代码1. 创建一个简单的属性 class MyClass: def __init__(self): self._x = None def get_x(self): return self._x def set_x(self, value): self._x = value def del_x(self): del self._x x = property(get_x, set_x, del_x, "This is the 'x' property.") # 使用 property() 函数创建属性 obj = MyClass() obj.x = 10 # 调用 setter 方法 print(obj.x) # 调用 getter 方法并获取属性值 2. 使用装饰器语法创建属性 class MyClass: def __init__(self): self._x = None @property def x(self): return self._x @x.setter def x(self, value): self._x = value @x.deleter def x(self): del self._x # 使用装饰器语法创建属性 obj = MyClass() obj.x = 20 # 调用 setter 方法 print(obj.x) # 调用 getter 方法并获取属性值 3. 只读属性 class Circle: def __init__(self, radius): self._radius = radius @property def radius(self): return self._radius # 只读属性示例 circle = Circle(5) print(circle.radius) # Output: 5 4. 计算属性 class Rectangle: def __init__(self, width, height): self._width = width self._height = height @property def area(self): return self._width * self._height # 计算属性示例 rectangle = Rectangle(4, 5) print(rectangle.area) # Output: 20 5. 删除属性 class MyClass: def __init__(self): self._x = None @property def x(self): return self._x @x.deleter def x(self): del self._x # 删除属性示例 obj = MyClass() obj.x = 10 del obj.x 应用场景1. 数据封装与保护使用 property() 函数可以实现对属性的封装,控制属性的访问权限,确保数据安全。 class BankAccount: def __init__(self, balance=0): self._balance = balance @property def balance(self): return self._balance @balance.setter def balance(self, value): if value < 0: raise ValueError("Balance cannot be negative") self._balance = value # 数据封装与保护示例 account = BankAccount(100) print(account.balance) # Output: 100 account.balance = 200 # 调用 setter 方法 print(account.balance) # Output: 200 2. 属性计算与逻辑处理通过定义计算属性,可以实现属性的动态计算,简化代码逻辑。 class Circle: def __init__(self, radius): self._radius = radius @property def area(self): return 3.14 * self._radius ** 2 # 属性计算与逻辑处理示例 circle = Circle(5) print(circle.area) # Output: 78.5 编写高级 getter 和 setter 方法property() 函数不仅可以用于简单地创建属性,还可以用于编写更加复杂的 getter 和 setter 方法,以实现更多功能和逻辑。1. 高级 getter 方法 class Temperature: def __init__(self, celsius): self._celsius = celsius @property def celsius(self): return self._celsius @property def fahrenheit(self): return (self._celsius * 9/5) + 32 @property def kelvin(self): return self._celsius + 273.15 # 高级 getter 方法示例 temp = Temperature(25) print(temp.celsius) # Output: 25 print(temp.fahrenheit) # Output: 77.0 print(temp.kelvin) # Output: 298.15 2. 高级 setter 方法 class Temperature: def __init__(self, celsius): self._celsius = celsius @property def celsius(self): return self._celsius @celsius.setter def celsius(self, value): if value < -273.15: raise ValueError("Temperature cannot be less than -273.15°C") self._celsius = value # 高级 setter 方法示例 temp = Temperature(25) temp.celsius = 30 print(temp.celsius) # Output: 30 temp.celsius = -300 # ValueError: Temperature cannot be less than -273.15°C 结合静态方法和类方法property() 函数还可以与静态方法和类方法结合使用,以满足更复杂的需求。1. 结合静态方法 class Math: PI = 3.14 def __init__(self, radius): self._radius = radius @property def radius(self): return self._radius @staticmethod def circle_area(radius): return Math.PI * radius ** 2 # 结合静态方法示例 radius = 5 area = Math.circle_area(radius) print(area) # Output: 78.5 2. 结合类方法 class Math: PI = 3.14 def __init__(self, radius): self._radius = radius @property def radius(self): return self._radius @classmethod def circle_area(cls, radius): return cls.PI * radius ** 2 # 结合类方法示例 radius = 5 area = Math.circle_area(radius) print(area) # Output: 78.5 高级应用场景1. 对象属性的验证和控制使用 property() 函数可以在设置属性值时进行验证,以确保数据的有效性 class Person: def __init__(self, age): self._age = age @property def age(self): return self._age @age.setter def age(self, value): if not isinstance(value, int): raise ValueError("Age must be an integer") if value < 0: raise ValueError("Age cannot be negative") self._age = value # 对象属性的验证和控制示例 person = Person(30) person.age = 25 # 正常设置年龄 print(person.age) # Output: 25 person.age = -5 # ValueError: Age cannot be negative 2. 访问控制和权限管理通过定义私有属性和相应的 getter 和 setter 方法,可以实现对对象的访问控制和权限管理。 class BankAccount: def __init__(self, balance=0): self._balance = balance @property def balance(self): return self._balance @balance.setter def balance(self, value): if value < 0: raise ValueError("Balance cannot be negative") self._balance = value # 访问控制和权限管理示例 account = BankAccount(100) print(account.balance) # Output: 100 account.balance = 200 # 正常设置余额 print(account.balance) # Output: 200 account.balance = -50 # ValueError: Balance cannot be negative
-
问题描述解决方案第一步:创建math_operations.py文件第二步:在main.py中导入math_operations.py总结在Python中,我们可以通过import语句来导入其他的.py文件,以便在当前文件中使用其中定义的函数、变量和类等。本文将介绍如何在Python中导入其他的.py文件,并通过一个具体的问题来演示如何解决。问题描述假设我们有一个名为math_operations.py的文件,其中定义了一些数学运算的函数,如加法、减法、乘法和除法。现在我们想在另一个文件main.py中使用这些函数,该如何导入math_operations.py文件呢?解决方案第一步:创建math_operations.py文件首先,我们需要创建一个math_operations.py文件,其中包含一些数学运算的函数: # math_operations.py def add(x, y): return x + y def subtract(x, y): return x - y def multiply(x, y): return x * y def divide(x, y): if y == 0: raise ValueError("Cannot divide by zero!") return x / y 第二步:在main.py中导入math_operations.py接下来,在main.py文件中,我们可以使用import语句来导入math_operations.py文件,并使用其中定义的函数: # main.py import math_operations result_add = math_operations.add(5, 3) print("Addition result:", result_add) result_subtract = math_operations.subtract(5, 3) print("Subtraction result:", result_subtract) result_multiply = math_operations.multiply(5, 3) print("Multiplication result:", result_multiply) result_divide = math_operations.divide(6, 2) print("Division result:", result_divide) 通过以上代码,我们成功导入了math_operations.py文件,并在main.py文件中使用了其中定义的函数。
-
多组数据双刻度坐标共享多组数据在一副图像中表现多组数据时,可能会遇到不同数据之间数据相差较大的情况,为此可在同一个坐标框中设置不同的坐标刻度,以实现下图所示效果。为了实现这一功能,关键函数即为twinx。 import numpy as np import matplotlib.pyplot as plt x = np.arange(10) y = 2**x dy = np.diff(y) sinx = np.sin(x) fig, ax = plt.subplots() p1 = ax.bar(x, y, color='blue') ax.set(xlabel="x", ylabel="y") ax.yaxis.label.set_color('blue') ax.tick_params(axis='y', colors="blue") ax2 = ax.twinx() p2, = ax2.plot(x[1:], dy, "C1") ax2.set(ylabel="diff(y)") ax2.yaxis.label.set_color(p2.get_color()) ax2.tick_params(axis='y', colors=p2.get_color()) ax3 = ax.twinx() ax3.spines.right.set_position(("axes", 1.2)) p3, = ax3.plot(x, sinx, "C2") ax3.set(ylabel="sin(x)") ax3.yaxis.label.set_color(p3.get_color()) ax3.tick_params(axis='y', colors=p3.get_color()) plt.tight_layout() plt.show() 上述代码中,一共有三组y yy轴,分别是主坐标轴ax和后续创建的孪生坐标轴ax2和ax3。先看ax的设置,主要用到了三个方法,分别是set 用于设置x , y x,yx,y的坐标标签yaxis.label.set_color,用于设置y yy轴坐标标签的颜色ax.tick_params 设置坐标刻度的颜色,ax2通过twinx函数新增了一个坐标轴,其设置与ax基本相同,唯一的区别是,在设置颜色时,采用了get_color()函数,从而直接在图像中提取颜色。ax3与ax2还有一个差别,即在新建坐标轴之后,调用ax3.spines.right.set_position,以设置刻度线的位置。双刻度除了上面那种多组数据的情况,有时为了照顾不同文化的人群,即使对一组数据可能也要设计两组坐标,并采取不同的单位。比如常见的角度制和弧度制,二者互有优劣,那么在绘制图像时,可以分别将这两种坐标都表现出来。为此,可直接调用secondary_xaxis方法来实现 x = np.linspace(0,10,101) y = np.sin(x) ax = plt.subplot() ax.plot(x,y) ax.set_xlabel('angle [rad]') secax = ax.secondary_xaxis('top', functions=(np.rad2deg, np.deg2rad)) secax.set_xlabel('angle [degrees]') plt.show() 其第一个参数为坐标位置,可选top, bottom, left和right。第二个参数为坐标转换函数。坐标共享有时需要在一个图像中使用多个坐标,而有的时候则刚好有相反的需求,当一个图像中有多个子图时,若这些子图坐标的含义相同,那么省略一些坐标可以让图像更加简洁,从而有了共用坐标的需求。在【plt】中,通过sharex或者sharey可以起到共享x或y轴坐标的作用。示例如下 x = np.linspace(-5,5,100) ys = [np.sin(x+i) for i in range(5)] fig,axes = plt.subplots(2,2,sharex=True, sharey=True) axes = axes.reshape(-1) for i in range(4): axes[i].plot(x, ys[i]) plt.show() 直接通过subplots来创建图窗和坐标轴,尽管用一行代码解决了很多问题,但相应地也不够灵活,而灵活添加坐标轴的函数add_subplot也有sharex和sharey的参数,但二者并不是布尔型参数,而是需要输入希望共享的坐标轴。基于这种方式,也可以提供与上图相同的解决方案,代码如下 fig = plt.figure() ax3 = fig.add_subplot(223) ax3.plot(x,ys[2]) ax1 = fig.add_subplot(221, sharex=ax3) ax1.plot(x,ys[0]) ax1.tick_params(axis="x", labelbottom=False) ax4 = fig.add_subplot(224, sharey=ax3) ax4.plot(x,ys[3]) ax4.tick_params(axis="y", labelleft=False) ax2 = fig.add_subplot(222, sharex=ax4, sharey=ax1) ax2.plot(x,ys[1]) ax2.tick_params(axis="x", labelbottom=False) ax2.tick_params(axis="y", labelleft=False) plt.show()
-
技术背景在python中定义一个列表时,我们一定要注意其中的可变对象的原理。虽然python的语法中没有指针,但是实际上定义一个列表变量时,是把变量名指到了一个可变对象上。如果此时我们定义另外一个变量也指到同一个可变对象的话,就会造成一个“联动”的现象。也就是改变其中的一个值时,另一个值也会随之而改变。本文使用的Python版本为Python 3.7.13测试案例这里我们先定义一个列表a,然后把这个空的列表a直接赋值给变量b,此时a和b都是一个空的列表:In [1]: a = [] In [2]: b = a In [3]: print (a,b) [] []那么如果此时我们修改a的值,那么此前被a赋值的变量b是否也会随之改变呢?In [4]: a.append(1) In [5]: print (a,b) [1] [1] In [6]: a.append(2) In [7]: print (a,b) [1, 2] [1, 2] In [8]: a = [3] In [9]: print (a,b) [3] [1, 2] In [10]: a.append(4) In [11]: print (a,b) [3, 4] [1, 2] 从运行结果来看,我们可以发现,当对a先后扩展一个元素1和2时,变量b的值也随之改变,跟a是同步变化的。但是如果把a这个变量名指向一个新的列表上,此时b的值不会发生变化。这就相当于,给变量a赋新的值的时候,变量b指向了a原来的值,而a这个变量名指向了新的数值,此后两者之间的关联就消失了。之所以没有指针定义的python编程语言,会出现这样的情况,就是因为列表类型属于可变参量,所以如果把两个变量指向同一个列表,两个变量的值是会同步的,即使初始的列表不是一个空的列表,结果也是一样的:In [23]: a = [1] In [24]: b = a In [25]: a += [2] In [26]: print (a,b) [1, 2] [1, 2]而且这个同步还是双向的,也就是说,修改a会同步到b,修改b也会同步到a:In [11]: a = [] In [12]: b = a In [13]: b.append(5) In [14]: print (a,b) [5] [5]那么除了列表这个数据结构之外,其他类型的数据结构是否存在类似的现象呢?首先用字典类型来测试一下:In [10]: a = {} In [11]: b = a In [12]: print (a,b) {} {} In [13]: a[1]=1 In [14]: print (a,b) {1: 1} {1: 1}经过测试我们发现,字典也是属于可变参量的类型。除了列表和字典外,其他的就是普通的数值类型和元组Tuple类型,还有一些第三方定义的数据类型,也可以分别测试一下:In [15]: a = 1 In [16]: b = a In [17]: a += 1 In [18]: print (a,b) 2 1 In [19]: a = (1,) In [20]: b = a In [21]: a += (2,) In [22]: print (a,b) (1, 2) (1,) In [23]: a = '1' In [24]: b = a In [25]: a += '2' In [26]: print (a,b) 12 1 测试结果表明,数值类型和元组类型在“链式”赋值之后,是直接把值给了其他变量的,而不是传递一个指针。但是另一个需要引起重视的是,第三方numpy所定义的array,也是一个可变参量:In [15]: a = 1 In [16]: b = a In [17]: a += 1 In [18]: print (a,b) 2 1 In [19]: a = (1,) In [20]: b = a In [21]: a += (2,) In [22]: print (a,b) (1, 2) (1,) In [23]: a = '1' In [24]: b = a In [25]: a += '2' In [26]: print (a,b) 12 1 可以发现,a和b两者的结果也是同步变化的。因为没研究过Python的底层实现,也许区分可变参量和非可变参量的方法,就是看其能不能被哈希?In [15]: hash(1) Out[15]: 1 In [16]: hash([1]) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-16-0579e98ca3ee> in <module> ----> 1 hash([1]) TypeError: unhashable type: 'list' In [17]: hash({'1':1}) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-17-b18acecf6a20> in <module> ----> 1 hash({'1':1}) TypeError: unhashable type: 'dict' In [18]: hash((1,)) Out[18]: 3430019387558 In [29]: hash(np.array([1.])) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-29-b9e8d96de6be> in <module> ----> 1 hash(np.array([1.])) TypeError: unhashable type: 'numpy.ndarray' In [30]: hash(np.array([1.]).tobytes()) Out[30]: 1211024724661850177从结果中我们发现,那些可以被哈希的类型都是非可变参量,也就是在“链式赋值”的过程中不会发生“联动”的类型。总结概要假如你在Python中初始化了一个变量a的值,然后用a来初始化另一个变量b,此时你希望得到的b的数值是跟a同步变化的,还是独立变化的呢?Python这个编程语言虽然没有指针类型,但是Python中的可变参量也可以像指针一样,改变一个数值之后,所有指向该数值的可变参量都会随之而改变。就比如说改变a的值,会同步的去改变b的值。那么我们应该对这种类型的赋值有所了解,才能够避免在实际的编程中犯错。
-
1. 搭建项目2. 响应页面3. 首页3.1 页面解析3.2 首页数据格式定义4. 配置文件读取5. 假数据-显示首页内容如何使用原生Go开发一个web项目循序渐进,掌握编程思维和思路初步具有工程思维,能适应一般的开发工作1. 搭建项目 package main import ( "encoding/json" "log" "net/http" ) type IndexData struct { Title string `json:"title"` Desc string `json:"desc"` } func index(w http.ResponseWriter,r *http.Request) { w.Header().Set("Content-Type","application/json") var indexData IndexData indexData.Title = "码神之路go博客" indexData.Desc = "现在是入门教程" jsonStr,_ := json.Marshal(indexData) w.Write(jsonStr) } func main() { //程序入口,一个项目 只能有一个入口 //web程序,http协议 ip port server := http.Server{ Addr: "127.0.0.1:8080", } http.HandleFunc("/",index) if err := server.ListenAndServe();err != nil{ log.Println(err) } } 2. 响应页面 func indexHtml(w http.ResponseWriter,r *http.Request) { t := template.New("index.html") viewPath, _ := os.Getwd() t,_ = t.ParseFiles(viewPath + "/template/index.html") var indexData IndexData indexData.Title = "码神之路go博客" indexData.Desc = "现在是入门教程" err := t.Execute(w,indexData) fmt.Println(err) } func main() { //程序入口,一个项目 只能有一个入口 //web程序,http协议 ip port server := http.Server{ Addr: "127.0.0.1:8080", } http.HandleFunc("/",index) http.HandleFunc("/index.html",indexHtml) if err := server.ListenAndServe();err != nil{ log.Println(err) } } 3. 首页3.1 页面解析 func index(w http.ResponseWriter,r *http.Request) { var indexData IndexData indexData.Title = "码神之路go博客" indexData.Desc = "现在是入门教程" t := template.New("index.html") //1. 拿到当前的路径 path,_ := os.Getwd() //访问博客首页模板的时候,因为有多个模板的嵌套,解析文件的时候,需要将其涉及到的所有模板都进行解析 home := path + "/template/home.html" header := path + "/template/layout/header.html" footer := path + "/template/layout/footer.html" personal := path + "/template/layout/personal.html" post := path + "/template/layout/post-list.html" pagination := path + "/template/layout/pagination.html" t,_ = t.ParseFiles(path + "/template/index.html",home,header,footer,personal,post,pagination) //页面上涉及到的所有的数据,必须有定义 t.Execute(w,indexData) } 3.2 首页数据格式定义config/config.go package config type Viewer struct { Title string Description string Logo string Navigation []string Bilibili string Avatar string UserName string UserDesc string } type SystemConfig struct { AppName string Version float32 CurrentDir string CdnURL string QiniuAccessKey string QiniuSecretKey string Valine bool ValineAppid string ValineAppkey string ValineServerURL string } models/category.go package models type Category struct { Cid int Name string CreateAt string UpdateAt string } models/post.go package models import ( "goblog/config" "html/template" "time" ) type Post struct { Pid int `json:"pid"` // 文章ID Title string `json:"title"` // 文章ID Slug string `json:"slug"` // 自定也页面 path Content string `json:"content"` // 文章的html Markdown string `json:"markdown"` // 文章的Markdown CategoryId int `json:"categoryId"` //分类id UserId int `json:"userId"` //用户id ViewCount int `json:"viewCount"` //查看次数 Type int `json:"type"` //文章类型 0 普通,1 自定义文章 CreateAt time.Time `json:"createAt"` // 创建时间 UpdateAt time.Time `json:"updateAt"` // 更新时间 } type PostMore struct { Pid int `json:"pid"` // 文章ID Title string `json:"title"` // 文章ID Slug string `json:"slug"` // 自定也页面 path Content template.HTML `json:"content"` // 文章的html CategoryId int `json:"categoryId"` // 文章的Markdown CategoryName string `json:"categoryName"` // 分类名 UserId int `json:"userId"` // 用户id UserName string `json:"userName"` // 用户名 ViewCount int `json:"viewCount"` // 查看次数 Type int `json:"type"` // 文章类型 0 普通,1 自定义文章 CreateAt string `json:"createAt"` UpdateAt string `json:"updateAt"` } type PostReq struct { Pid int `json:"pid"` Title string `json:"title"` Slug string `json:"slug"` Content string `json:"content"` Markdown string `json:"markdown"` CategoryId int `json:"categoryId"` UserId int `json:"userId"` Type int `json:"type"` } type SearchResp struct { Pid int `orm:"pid" json:"pid"` // 文章ID Title string `orm:"title" json:"title"` } type PostRes struct { config.Viewer config.SystemConfig Article PostMore } models/home.go package models type HomeData struct { config.Viewer Categorys []Category Posts []PostMore Total int Page int Pages []int PageEnd bool } 4. 配置文件读取config.toml:[viewer] Title = "码神之路Go语言博客" Description = "码神之路Go语言博客" Logo = "/resource/images/logo.png" Navigation = ["首页","/", "GO语言","/golang", "归档","/pigeonhole", "关于","/about"] Bilibili = "https://space.bilibili.com/473844125" Zhihu = "https://www.zhihu.com/people/ma-shen-zhi-lu" Avatar = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F13147603927%2F1000.jpg&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1647242040&t=c6108010ed46b4acebe18955acdd2d24" UserName = "码神之路" UserDesc = "长得非常帅的程序员" [system] CdnURL = "https://static.mszlu.com/goblog/es6/md-assets" QiniuAccessKey = "替换自己的" QiniuSecretKey = "替换自己的" Valine = true ValineAppid = "替换自己的" ValineAppkey = "替换自己的" ValineServerURL = "替换自己的" package config import ( "github.com/BurntSushi/toml" "os" ) type TomlConfig struct { Viewer Viewer System SystemConfig } type Viewer struct { Title string Description string Logo string Navigation []string Bilibili string Avatar string UserName string UserDesc string } type SystemConfig struct { AppName string Version float32 CurrentDir string CdnURL string QiniuAccessKey string QiniuSecretKey string Valine bool ValineAppid string ValineAppkey string ValineServerURL string } var Cfg *TomlConfig func init() { Cfg = new(TomlConfig) var err error Cfg.System.CurrentDir, err = os.Getwd() if err != nil { panic(err) } Cfg.System.AppName = "mszlu-go-blog" Cfg.System.Version = 1.0 _,err = toml.DecodeFile("config/config.toml",&Cfg) if err != nil { panic(err) } } 5. 假数据-显示首页内容 package main import ( "html/template" "log" "ms-go-blog/config" "ms-go-blog/models" "net/http" "time" ) type IndexData struct { Title string `json:"title"` Desc string `json:"desc"` } func IsODD(num int) bool { return num%2 == 0 } func GetNextName(strs []string,index int) string{ return strs[index+1] } func Date(layout string) string{ return time.Now().Format(layout) } func index(w http.ResponseWriter,r *http.Request) { t := template.New("index.html") //1. 拿到当前的路径 path := config.Cfg.System.CurrentDir //访问博客首页模板的时候,因为有多个模板的嵌套,解析文件的时候,需要将其涉及到的所有模板都进行解析 home := path + "/template/home.html" header := path + "/template/layout/header.html" footer := path + "/template/layout/footer.html" personal := path + "/template/layout/personal.html" post := path + "/template/layout/post-list.html" pagination := path + "/template/layout/pagination.html" t.Funcs(template.FuncMap{"isODD":IsODD,"getNextName":GetNextName,"date":Date}) t,err := t.ParseFiles(path + "/template/index.html",home,header,footer,personal,post,pagination) if err != nil { log.Println(err) } //页面上涉及到的所有的数据,必须有定义 var categorys = []models.Category{ { Cid: 1, Name: "go", }, } var posts = []models.PostMore{ { Pid: 1, Title: "go博客", Content: "内容", UserName: "码神", ViewCount: 123, CreateAt: "2022-02-20", CategoryId:1, CategoryName: "go", Type:0, }, } var hr = &models.HomeResponse{ config.Cfg.Viewer, categorys, posts, 1, 1, []int{1}, true, } t.Execute(w,hr) } func main() { //程序入口,一个项目 只能有一个入口 //web程序,http协议 ip port server := http.Server{ Addr: "127.0.0.1:8080", } http.HandleFunc("/",index) http.Handle("/resource/",http.StripPrefix("/resource/",http.FileServer(http.Dir("public/resource/")))) if err := server.ListenAndServe();err != nil{ log.Println(err) } }
-
本文将介绍通过Python绘制地形图的方法,所需第三方Python相关模块包括 rasterio、geopandas、cartopy 等,可通过 pip 等方式安装。1 示例代码1.1 导入相关模块 import rasterioimport geopandas as gpdimport numpy as npimport cartopy.crs as ccrsimport matplotlib.pyplot as pltfrom matplotlib.colors import LinearSegmentedColormap1.2 设置地图字体及字号 plt.rcParams["font.family"] = "Times New Roman"plt.rcParams["font.size"] = 141.3 绘制地图 # 设置投影:墨卡托投影# cartopy 投影说明:https://www.cnblogs.com/youxiaogang/p/14247184.htmlprojection = ccrs.Mercator()# 绘制地图fig, ax = plt.subplots(figsize=(20, 10), subplot_kw={'projection': projection})# 设置地图范围(数值参数为对应投影下的范围坐标)ax.set_extent([13530000, 14630000, 4960000, 5850000], crs=projection)# 读取矢量文件shp = gpd.read_file("Data/Jilin_Mercator.shp")shp.plot(ax=ax, transform=projection, edgecolor="black", linewidth=1, facecolor="none")# 创建自定义颜色映射colors = ["#369121", "#95C769", "#FFFFBF", "#E6865A", "#D14E30", "#BA1414"]n_bins = 100 # 定义色带的颜色数量cmap_name = "green_brown"cm = LinearSegmentedColormap.from_list(cmap_name, colors, N=n_bins)# 读取地形栅格数据dataset = rasterio.open("Data/DEM_Jilin_Mercator.tif")data = dataset.read(1) # 读取第一个波段的数据nodata_value = dataset.nodata # 获取NoData值# 创建掩膜,去除NoData区域data = np.ma.masked_where(data == nodata_value, data)# 将地形栅格添加到地图中extent = [dataset.bounds.left, dataset.bounds.right,dataset.bounds.bottom, dataset.bounds.top]im = ax.imshow(data, origin="upper", extent=extent,transform=projection, cmap=cm)# 绘制网格线并添加标签gl = ax.gridlines(draw_labels=True, linestyle="--", color="#4F4F4F")gl.xlocator = plt.FixedLocator(range(120, 135, 3))gl.ylocator = plt.FixedLocator(range(40, 50, 2))# 添加色带,设置色带的缩放比例为 0.4,主图和色带之间的间距为 0.1cbar = plt.colorbar(im, ax=ax, orientation="horizontal", shrink=0.4, pad=0.1)cbar.set_label("Elevation (m)", labelpad=10) # 设置色带标签与色带的距离为 10 点cbar.ax.xaxis.set_label_position("top") # 设置色带标签位置plt.savefig("Pic.jpg", dpi=600)plt.show()2 结果图展示转载自https://www.cnblogs.com/qsgeo/p/18030978
-
本次给大家带来的是CodeArts最新的干货合集25篇,涵盖了,python,java,springboot,kafka,vue,pinia等多个干货,快来看吧。 1.idea一直indexing无法操作的问题解决【转】 https://bbs.huaweicloud.com/forum/thread-0294142071416308014-1-1.html 2.VSCode打开Json文件格式化的简单步骤【转】 https://bbs.huaweicloud.com/forum/thread-0243142071705276018-1-1.html 3.PHP8.3更新内容新特性及支持版本探究【转】 https://bbs.huaweicloud.com/forum/thread-0271142072065293019-1-1.html 4.springboot如何配置多kafka【转】 https://bbs.huaweicloud.com/forum/thread-0243142072165273019-1-1.html 5.java中@NotBlank限制属性不能为空【转】 https://bbs.huaweicloud.com/forum/thread-0297142073070924013-1-1.html 6.正则去除中括号(符号)及里面包含的内容(最新推荐)【转】 https://bbs.huaweicloud.com/forum/thread-0243142071315437017-1-1.html 7.python Dtale库交互式数据探索分析和可视化界面【转】 https://bbs.huaweicloud.com/forum/thread-0255142071244033020-1-1.html 8.python dataprep库简化加速数据科学操作【转】 https://bbs.huaweicloud.com/forum/thread-0294142071061284012-1-1.html 9.python kornia计算机视觉库实现图像变化【转】 https://bbs.huaweicloud.com/forum/thread-0255142070801280018-1-1.html 10.基于Python实现n-gram文本生成的示例代码【转】 https://bbs.huaweicloud.com/forum/thread-0271142070636778018-1-1.html 11.python第三方模块xmltodict库优雅处理xml格式为json【转】 https://bbs.huaweicloud.com/forum/thread-0259142068233301011-1-1.html 12.python Stanza处理NLP任务使用详解(多语言处理工具)【转】 https://bbs.huaweicloud.com/forum/thread-0271142068138833017-1-1.html 13.Python Arrow处理时间数据使用详解(标准库之外另一种选择)【转】 https://bbs.huaweicloud.com/forum/thread-0297142067851262012-1-1.html 14.python list 切片倒着取的实现示例【转】 https://bbs.huaweicloud.com/forum/thread-0243142067708249015-1-1.html 15.Python Fire中两种命令行参数灵活设置方式详解【转】 https://bbs.huaweicloud.com/forum/thread-0271142067433292016-1-1.html 16.pinia初学习 https://bbs.huaweicloud.com/forum/thread-0202141875876618017-1-1.html 17.为什么需要使用$nextTick?【转】 https://bbs.huaweicloud.com/forum/thread-0231141875789608020-1-1.html 18.Vue自动生成组件名【转】 https://bbs.huaweicloud.com/forum/thread-0296141875621746009-1-1.html 19.工程化第一步这个package.json要真的搞明白才行【转】 https://bbs.huaweicloud.com/forum/thread-0267141875153948017-1-1.html 20.关于vite的跨域问题【转】 https://bbs.huaweicloud.com/forum/thread-0231141874969502019-1-1.html 21.前端无感知刷新token & 超时自动退出【转】 https://bbs.huaweicloud.com/forum/thread-02118141874791175015-1-1.html 22.按钮防连点终极解决方案 【转】 https://bbs.huaweicloud.com/forum/thread-0224141874429208008-1-1.html 23.5分钟搞定vue3函数式弹窗【转】 https://bbs.huaweicloud.com/forum/thread-0202141874275399016-1-1.html 24.有了Composition API后,有些场景或许你不需要pinia了【转】 https://bbs.huaweicloud.com/forum/thread-02118141874125748014-1-1.html 25.Vue中的$attrs你真的会用吗?【转】 https://bbs.huaweicloud.com/forum/thread-0296141873968992008-1-1.html
-
D-Tale 是一个 Python 库,为数据探索、分析和可视化提供了交互式且易于使用的界面。它构建在流行的数据操作和可视化库(例如 Pandas、Plotly 和 Flask)之上。借助 D-Tale,你可以快速将数据加载到 DataFrame 中,然后使用基于 Web 的界面以表格格式探索数据集。它允许你对数据执行各种操作,例如过滤、排序、聚合和转换列。此外,D-Tale 还提供统计摘要、相关性分析和缺失值处理功能。D-Tale 的主要功能之一是它能够自动生成可视化。它提供了一个交互式绘图界面,允许你创建图表、直方图、散点图等。你可以自定义可视化效果、调整参数并轻松将其导出为图像或 HTML 文件。库的安装在使用该库之前,我们需要做的第一步是使用 pip 安装该库。1pip install dtale加载数据集这里我们以 Gapminder 数据为例。Gapminder 提供全球每个国家的人口数量、人均 GDP 和预期寿命等数据。使用 dtale 访问数据,你可以编写以下代码。import dtale import pandas as pd df = pd.read_csv('your_data_path') d = dtale.show(df) d探索性数据分析使用 dtale,你可以进行不同类型的可视化。如果你想分析每一列,你可以使用库中的 “描述” 功能。要访问该功能,你可以将鼠标悬停到界面顶部,然后选择“可视化”>“描述”,如下所示:在页面中,你可以对每一列进行查看和分析。我们来看看预期寿命一栏。在顶部,你可以看到显示不同可视化效果的选项卡。现在让我从顶部向你解释每个选项卡。第一个选项卡是描述选项卡,其中包含所选列的统计摘要。它还显示列中的箱线图。第二个选项卡是直方图选项卡,它可视化列的直方图。你可以通过更改箱数或根据特定列对数据进行分组来调整直方图可视化。第三个选项卡是分组选项卡,它可视化一个条形图,该条形图根据分类列聚合列值。最后一个选项卡是 QQ 图。该图基本上告诉我们列的分布情况。你可以看到一条直线及其内部的数据点。数据点越接近直线,分布就越正态。
-
Dataprep 是一个开源的 Python 库,它的主要目标是简化和加快数据科学操作,特别关注简化探索性数据分析(EDA) 阶段。通过利用 DataPrep 的强大功能,数据科学家可以显着减少执行 EDA 任务所花费的时间。该库包含三个主要的API供我们使用,它们是:从常见数据源收集数据(dataprep.connector )进行探索性数据分析(dataprep.eda)清理和标准化数据(dataprep.clean)DataPrep 包旨在实现快速数据探索,并与 Pandas 的 DataFrame 对象良好配合。库的安装我们将首先使用 pip 安装 Dataprep 库。下面给出的命令将执行此操作。1pip install -U dataprep数据准备DataPrep 使我们能够使用一行代码创建交互式配置文件报告。该报告对象是一个与我们的 Notebook 分离的 HTML 对象,具有多种探索选择。让我们使用示例数据尝试该 API。1234from dataprep.datasets import load_datasetfrom dataprep.eda import create_reportdf = load_dataset("titanic")df.head()我们将使用泰坦尼克号样本数据集作为我们的数据。加载数据后,我们将使用 create_report 函数来生成交互式报告。1create_report(df).show_browser()概述选项卡从概述选项卡中,我们可以看到数据集中的所有概述信息。我们可以获得的信息包括缺失数据数量和百分比、重复数据、变量数据类型以及每个变量的详细信息。变量选项卡变量选项卡为我们提供了数据集中每个变量的详细信息。几乎你需要的所有信息都可用,例如,分位数和描述性统计、分布和正态性。交互选项卡交互选项卡将从两个数值变量创建散点图。我们可以自己设置 X 轴和 Y 轴,这使我们能够控制如何可视化它。相关性选项卡相关性选项卡为我们提供了数值之间的统计相关性。目前,我们可以使用三种计算:Pearson、Spearman 和 KendallTau。缺失值选项卡缺失值选项卡为我们提供了有关选项卡中缺失值的所有详细信息。我们可以选择条形图、频谱、热图和树状图来充分探索缺失值信息。数据清理DataPrep Cleaning API 集合提供了 140 多个 API 来清理和验证我们的 DataFrame。让我们通过泰坦尼克号数据集示例尝试列标题清理功能。12from dataprep.clean import clean_headersclean_headers(df, case = 'const').head()如果你想要一个完整干净的 DataFrame,我们可以使用 DataPrep 中的 clean_df API 。该 API 将有两个输出—推断的数据类型和清理后的 DataFrame。
-
kornia 是一个基于 PyTorch 的计算机视觉库,它提供了一系列的图像变换、几何变换、特征检测和描述子等计算机视觉算法,可以帮助开发者更方便地实现计算机视觉任务。kornia 的目标是提供一种简单、灵活、高效的计算机视觉工具,使得开发者可以更加专注于算法的实现和优化。kornia 的特点包括:基于 PyTorch,具有高效的 GPU 加速和自动微分功能;提供了丰富的图像变换、几何变换和特征检测算法;支持批量处理和数据增强等常见的计算机视觉任务;具有灵活的接口和易于使用的 API。安装kornia 可以通过 pip 安装,安装命令如下:1pip install korniakornia 依赖于 PyTorch,因此需要先安装 PyTorch。可以根据自己的环境和需求选择合适的 PyTorch 版本进行安装。kornia 进行图像变换下面我们来看一个简单的 kornia 示例,演示如何使用 kornia 进行图像变换。首先,我们需要导入 kornia 和 PyTorch:12import torchimport kornia然后,我们可以读取一张图像,并将其转换为 PyTorch 张量:123456import cv2# 读取图像img = cv2.imread('test.jpg')# 将图像转换为 PyTorch 张量img_tensor = kornia.image_to_tensor(img, keepdim=False).float() / 255.0接下来,我们可以使用 kornia 提供的图像变换函数对图像进行变换。例如,我们可以使用 kornia 的旋转函数对图像进行旋转:123456# 定义旋转角度angle = torch.tensor([30.0])# 创建旋转矩阵rotation_matrix = kornia.rotation_matrix(angle, center=torch.zeros(1, 2))# 对图像进行旋转img_rotated = kornia.warp_affine(img_tensor, rotation_matrix)最后,我们可以将变换后的图像保存到文件中:1234# 将 PyTorch 张量转换为图像img_rotated = kornia.tensor_to_image(img_rotated.clamp(0.0, 1.0) * 255.0)# 保存图像cv2.imwrite('test_rotated.jpg', img_rotated)这就是一个简单的 kornia 示例,演示了如何使用 kornia 进行图像变换。总结kornia 是一个非常有用的 Python 库,它提供了丰富的计算机视觉算法和接口,可以帮助开发者更方便地实现计算机视觉任务。
-
N-gram是自然语言处理中常用的技术,它可以用于文本生成、语言模型训练等任务。本文将介绍什么是n-gram,如何在Python中实现n-gram文本生成,并提供丰富的示例代码来帮助大家更好地理解和应用这一技术。什么是N-gramN-gram是自然语言处理中的一种文本建模技术,用于对文本数据进行分析和生成。它是一种基于n个连续词语或字符的序列模型,其中n表示n-gram的大小。通常,n的取值为1、2、3等。Unigram(1-gram):一个单词或一个字符为一个单位。例如,“I”, “love”, “Python”。Bigram(2-gram):两个相邻的单词或字符为一个单位。例如,“I love”, “love Python”。Trigram(3-gram):三个相邻的单词或字符为一个单位。例如,“I love Python”。N-gram模型通过分析文本中不同n-gram的出现频率,可以用于文本分类、文本生成、语言模型等任务。实现N-gram文本生成下面将演示如何在Python中实现N-gram文本生成。将使用一个简单的示例来说明这一过程。1 准备文本数据首先,需要准备一些文本数据,这将作为训练数据。这里使用了莎士比亚的一些文本作为示例数据,可以使用自己的文本数据。 text = """ To be or not to be, that is the question; Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles And by opposing end them. To die—to sleep, No more; and by a sleep to say we end The heart-ache and the thousand natural shocks That flesh is heir to, 'tis a consummation Devoutly to be wish'd. To die, to sleep; To sleep, perchance to dream—ay, there's the rub, For in that sleep of death what dreams may come, When we have shuffled off this mortal coil, Must give us pause—there's the respect That makes calamity of so long life; The oppressor's wrong, the proud man's contumely, The pangs of despis'd love, the law's delay, The insolence of office, and the spurns That patient merit of the unworthy takes, When he himself might his quietus make With a bare bodkin? Who would these fardels bear, To grunt and sweat under a weary life, But that the dread of something after death— The undiscover'd country, from whose bourn No traveller returns—puzzles the will, And makes us rather bear those ills we have Than fly to others that we know not of? Thus conscience does make cowards of us all; And thus the native hue of resolution Is sicklied o'er with the pale cast of thought, And enterprises of great pith and moment With this regard their currents turn awry, And lose the name of action. """ # 去掉换行符,并将文本转换为小写 text = text.replace('\n', ' ').lower() 2 创建N-gram模型接下来,将创建一个N-gram模型,该模型可以接受一个文本字符串,并将其分割成n-gram序列。 def create_ngram_model(text, n): words = text.split() # 将文本分割成单词 ngrams = [] # 用于存储n-grams的列表 for i in range(len(words) - n + 1): ngram = ' '.join(words[i:i + n]) # 创建一个n-gram ngrams.append(ngram) return ngrams n = 2 # 选择2-gram模型 ngram_model = create_ngram_model(text, n) # 打印前10个2-grams print(ngram_model[:10]) 在上述示例中,定义了一个create_ngram_model函数,该函数接受文本和n值作为参数,并返回n-gram的列表。选择了2-gram模型(bigram),并打印了前10个2-grams。3 生成文本有了N-gram模型后,可以使用它来生成新的文本。生成文本的方法是随机选择一个n-gram作为起始点,然后根据模型中的n-gram频率来选择接下来的n-gram,依此类推,直到生成所需长度的文本。 import random def generate_text(ngram_model, n, length=50): generated_text = random.choice(ngram_model) # 随机选择一个n-gram作为起始点 words = generated_text.split() while len(words) < length: possible_next_ngrams = [ngram for ngram in ngram_model if ' '.join(words[-n + 1:]) in ngram] if not possible_next_ngrams: break next_ngram = random.choice(possible_next_ngrams) words.extend(next_ngram.split()) generated_text = ' '.join(words) return generated_text generated_text = generate_text(ngram_model, n, length=100) print(generated_text) 在上述示例中,定义了一个generate_text函数,该函数接受N-gram模型、n值和所需生成文本的长度作为参数。它从模型中随机选择一个n-gram作为起始点,并根据模型中的n-gram频率选择接下来的n-gram,直到生成指定长度的文本。改进N-gram模型虽然前面的示例中的N-gram模型能够生成文本,但它还有一些局限性。例如,它只考虑了相邻的n-gram,而没有考虑到更远的依赖关系。为了改进模型,可以考虑以下几种方法:1 增加n-gram的大小通过增加n-gram的大小(如3-gram或4-gram),模型可以捕捉更长范围的依赖关系,生成更具连贯性的文本。但需要注意,增加n-gram的大小也会增加模型的复杂度和数据需求# 增加n-gram的大小为3 n = 3 ngram_model = create_ngram_model(text, n) 2 使用更多的训练数据模型的性能通常取决于训练数据的质量和数量。如果有更多的文本数据可用,可以使用更多的训练数据来训练模型,以提高其性能。3 使用更高级的文本生成技术N-gram模型是一种基本的文本生成技术,但在实际应用中可能需要更高级的方法,如循环神经网络(RNN)或变换器(Transformer)等。这些模型可以学习更复杂的语言结构,生成更具语法和语义的文本。4 改进文本生成算法改进文本生成算法可以使生成的文本更具连贯性和多样性。一种常见的方法是使用温度(temperature)参数来调整生成的文本多样性,较高的温度会生成更多的随机性,而较低的温度会生成更加确定性的文本。 def generate_text_with_temperature(ngram_model, n, length=50, temperature=1.0): generated_text = random.choice(ngram_model) words = generated_text.split() while len(words) < length: possible_next_ngrams = [ngram for ngram in ngram_model if ' '.join(words[-n + 1:]) in ngram] if not possible_next_ngrams: break # 根据温度参数调整选择下一个n-gram的随机性 next_ngram = random.choices(possible_next_ngrams, weights=[1.0 / temperature] * len(possible_next_ngrams))[0] words.extend(next_ngram.split()) generated_text = ' '.join(words) return generated_text # 使用温度参数为0.5生成文本 generated_text = generate_text_with_temperature(ngram_model, n, length=100, temperature=0.5)
-
1、背景:工作中我们经常处理一些xml格式的数据,比如在抓取某网站数据时,我们会取巧去抓取他的RSS订阅信息等,那我们怎么解析这些数据呢,有一些传统的类似html lxml的工具包,今天给大家带来一个xmltodict 优雅处理xml格式为json的库2、什么是 XML?XML 指可扩展标记语言(EXtensible Markup Language)。XML 是一种很像HTML的标记语言。XML 的设计宗旨是传输数据,而不是显示数据。XML 标签没有被预定义。您需要自行定义标签。XML 被设计为具有自我描述性。XML 是 W3C 的推荐标准。3、什么是 RSS?RSS 指 Really Simple Syndication(真正简易联合)RSS 使您有能力聚合(syndicate)网站的内容RSS 定义了非常简单的方法来共享和查看标题和内容RSS 文件可被自动更新RSS 允许为不同的网站进行视图的个性化RSS 使用 XML 编写4、xmltodict安装1pip3 install xmltodict5、我们看下如何使用import xmltodict import json xml_str = ''' <bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore> ''' new_dict_obj = xmltodict.parse(xml_str) # 返回一个OrderedDict类型的对象 json_str = json.dumps(new_dict_obj) # 使用内置的json模块转换成json print(json_str)结果如下:{"bookstore": {"book": [{"@category": "COOKING", "title": {"@lang": "en", "#text": "Everyday Italian"}, "author": "Giada De Laurentiis", "year": "2005", "price": "30.00"}, {"@category": "CHILDREN", "title": {"@lang": "en", "#text": "Harry Potter"}, "author": "J K. Rowling", "year": "2005", "price": "29.99"}, {"@category": "WEB", "title": {"@lang": "en", "#text": "Learning XML"}, "author": "Erik T. Ray", "year": "2003", "price": "39.95"}]}}如何转成xml直接上代码import xmltodict new_dict_obj = {"bookstore": {"book": [{"@category": "COOKING", "title": {"@lang": "en", "#text": "Everyday Italian"}, "author": "Giada De Laurentiis", "year": "2005", "price": "30.00"}, {"@category": "CHILDREN", "title": {"@lang": "en", "#text": "Harry Potter"}, "author": "J K. Rowling", "year": "2005", "price": "29.99"}, {"@category": "WEB", "title": {"@lang": "en", "#text": "Learning XML"}, "author": "Erik T. Ray", "year": "2003", "price": "39.95"}]}} new_xml = xmltodict.unparse(new_dict_obj)# 这里直接放dict对象 print(new_xml)结果如下<?xml version="1.0" encoding="utf-8"?><bookstore><book category="COOKING"><title lang="en">Everyday Italian</title><author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book><book category="CHILDREN"><title lang="en">Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price></book><book category="WEB"><title lang="en">Learning XML</title><author>Erik T. Ray</author><year>2003</year><price>39.95</price></book></bookstore>
-
什么是Stanza?Stanza是斯坦福大学NLP小组开发的一个Python库,它集成了诸多NLP任务的处理能力,包括分词(tokenization)、词性标注(part-of-speech tagging)、依存句法分析(dependency parsing)等。而且,Stanza支持超过70种语言,可以说是一个真正的多语言处理工具。安装Stanza在开始之前,你需要确保已经安装了Stanza。打开你的命令行工具,输入以下命令进行安装:1pip install stanza示例一:快速进行分词和词性标注假设你收到了一段英文文本,你想要快速了解其中的单词及其词性。Stanza让这件事变得异常简单。首先,我们需要下载英文模型:12import stanzastanza.download('en') # 下载英文模型下载完成后,我们创建一个处理英语的NLP管道,并处理我们的文本:123nlp = stanza.Pipeline('en') # 创建英语NLP管道text = "Stanza is an amazing tool for NLP tasks."doc = nlp(text) # 处理文本现在我们可以遍历文本中的每个单词和它们的词性:123for sentence in doc.sentences: for word in sentence.words: print(f"Word: {word.text}\tPart of Speech: {word.pos}")这段代码会输出每个单词及其对应的词性,让你对文本有一个基本的语法理解。示例二:发现文本中的命名实体命名实体识别(NER)是NLP中的一个重要任务,它可以识别文本中的特定实体,如人名、地点、组织名等。使用Stanza进行NER同样非常直观:12345text = "Apple is looking at buying U.K. startup for $1 billion"doc = nlp(text) # 使用前面创建的NLP管道处理文本for ent in doc.ents: print(f"Entity: {ent.text}\tType: {ent.type}")这段代码会输出文本中识别的实体及其类型。例如,“Apple”会被识别为一个组织名(ORG),而“$1 billion”会被识别为金钱数额(MONEY)。现有模型和支持的 NLP 任务Stanza 包含了 60 多种语言模型,在 Universal Dependencies v2.5 数据集上进行了预训练。这些模型包括简体、繁体、古文中文,英语、法语、西班牙语、德语、日语、韩语、阿拉伯语等,甚至还有北萨米语等不太常见的语言。
-
Arrow是一个Python的时间处理库,它提供了更加简单、清晰的方式来创建、操作、格式化和转换日期、时间和时间戳。Arrow不仅支持时区处理,还提供了链式方法和多种语言的本地化支持。如果你觉得datetime让你感到烦恼,那么Arrow可能会成为你的新宠。安装Arrow在开始使用Arrow之前,我们需要先将它安装到我们的环境中。打开你的命令行工具,输入以下命令安装Arrow:1pip install arrow使用示例示例一:创建和格式化时间在Arrow中,创建当前时间、特定时间或者解析时间字符串都变得异常简单。 import arrow # 创建当前时间 now = arrow.now() print(f"当前时间:{now}") # 创建指定日期 specific_time = arrow.get(2023, 4, 1, 13, 30) print(f"指定时间:{specific_time}") # 解析时间字符串 parsed_time = arrow.get('2023-04-01T13:30:00', 'YYYY-MM-DDTHH:mm:ss') print(f"解析时间:{parsed_time}") # 格式化时间 formatted_time = now.format('YYYY-MM-DD HH:mm:ss') print(f"格式化时间:{formatted_time}") 在这个例子中,我们首先获取了当前的时间。然后,我们使用arrow.get方法创建了一个指定日期的Arrow对象。接着,我们解析了一个标准的时间字符串。最后,我们将当前时间格式化为我们想要的字符串格式。示例二:时间加减和时间范围Arrow库同样能够轻松地处理时间的加减,以及生成时间范围。 import arrow # 当前时间 now = arrow.now() # 时间加减 in_a_week = now.shift(weeks=1) print(f"一周后的时间:{in_a_week}") # 时间范围 start = arrow.get(2023, 4, 1) end = start.shift(months=1) for r in arrow.Arrow.span_range('day', start, end): print(f"日期:{r[0].format('YYYY-MM-DD')}") Arrow提供了许多强大的功能,比如处理时区、解析和格式化时间等。即使是编程新手,也能够轻松上手Arrow,享受它带来的便捷。
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签