0.Python 速查

Python数据科学速查表

0.风变编程-Python基础(整理版)

Python基础速查

常规

  • Python 对大小写敏感
  • Python 的索引从 0 开始
  • Python 使用空白符(制表符或空格)来缩进代码,而不是使用花括号

获取帮助

  • 获取主页帮助:help()
  • 获取函数帮助:help(str.replace)
  • 获取模块帮助:help(re)

模块(库)

Python的模块只是一个简单地以 .py 为后缀的文件。

  • 列出模块内容:dir(module1)
  • 导入模块:import module
  • 调用模块中的函数:module1.func1()

import语句会创建一个新的命名空间(namespace),并且在该命名空间内执行.py文件中的所有语句。如果你想把模块内容导入到当前命名空间,请使用from module1 import *语句。

数值类类型

查看变量的数据类型:type(variable)

六种经常使用的数据类型

  1. int/long:过大的 int 类型会被自动转化为 long 类型
  2. float:64 位,Python 中没有 double 类型
  3. bool:真或假
  4. str:在 Python 2 中默认以 ASCII 编码,而在 Python 3 中默认以 Unicode 编码

    • 字符串可置于单/双/三引号中
    • 字符串是字符的序列,因此可以像处理其他序列一样处理字符串
    • 特殊字符可通过 \ 或者前缀 r 实现:

      str1 = r'this\f?ff'
      
    • 字符串可通过多种方式格式化:

      template = '%.2f %s haha $%d';
      str1 = template % (4.88, 'hola', 2)
      
  5. NoneType(None):Python “null”值(None对象存在一个实例)

    • None不是一个保留关键字,而是NoneType的一个唯一实例
    • None通常是可选函数参数的默认值:

      def func1(a, b, c=None)
      
    • None的常见用法:

      if variable is None :
      
  6. datetime:Python内置的datetime模块提供了datetimedata以及time类型。

    • datetime组合了存储于datetime中的信息 python # 从字符串中创建 datetime
      dt1 = datetime.strptime('20091031', '%Y%m%d')
      # 获取 date 对象
      dt1.date()
      # 获取 time 对象
      dt1.time()
      # 将 datetime 格式化为字符串
      dt1.strftime('%m/%d/%Y%H:%M')
      # 更改字段值
      dt2 = dt1.replace(minute=0, second=30)
      # 做差, diff 是一个 datetime.timedelta 对象
      diff = dt1 - dt2

  • strboolintfloat同时也是显式类型转换函数。
  • 除字符串和元组外,Python 中的绝大多数对象都是可变的。

数据结构

:所有的“非只读(non-Get)”函数调用,比如下面例子中的list1.sort(),除非特别声明,都是原地操作(不会创建新的对象)。

元组

元组是 Python 中任何类型的对象的一个一维、固定长度、不可变的序列。

# 创建元组
tup1 = 4, 5, 6
tup1 = (6, 7, 8)
# 创建嵌套元组
tup1 = (4, 5, 6), (7, 8)
# 将序列或迭代器转化为元组
tuple([1, 0, 2])
# 连接元组
tup1 + tup2
# 解包元组
a, b, c = tup1

元组应用

# 交换两个变量的值
a, b = b, a

列表

列表是 Python 中任何类型的对象的一个一维、非固定长度、可变(比如内容可以被修改)的序列。

# 创建列表
list1 = [1, 'a', 3]
list1 = list(tup1)
# 连接列表
list1 + list2
list1.extend(list2)
# 追加到列表的末尾
list1.append('b')
# 插入指定位置
list1.insert(PosIndex, 'a')
# 反向插入,即弹出给定位置的值/删除
ValueAtIdx = list1.pop(PosIndex)
# 移除列表中的第一个值, a 必须是列表中第一个值
list1.remove('a')
# 检查成员
3 in list1 => True or False
# 对列表进行排序
list1.sort()
# 按特定方式排序
list1.sort(key=len) # 按长度排序
  • 使用 + 连接列表会有比较大的开支,因为这个过程中会创建一个新的列表,然后复制对象。因此,使用extend()是更明智的选择。
  • insertappend相比会有更大的开支(时间/空间)。
  • 在列表中检查是否包含一个值会比在字典和集合中慢很多,因为前者需要进行线性扫描,而后者是基于哈希表的,所以只需要花费常数时间。

内置的bisect模块

  • 对一个排序好的列表进行二分查找或插入
  • bisect.bisect找到元素在列表中的位置,bisect.insort将元素插入到相应位置。
  • 用法: python import bisect
    list1 = list(range(10))
    #找到 5 在 list1 中的位置,从 1 开始,因此 position = index + 1
    bisect.bisect(list1, 5)
    #将 3.5 插入 list1 中合适位置
    bisect.insort(list1, 3.5)

bisect 模块中的函数并不会去检查列表是否排序好,因为这会花费很多时间。所以,对未排序好的列表使用这些函数也不会报错,但可能会返回不正确的结果。

针对序列类型的切片

序列类型包括strarraytuplelist等。

用法:

list1[start:stop]
# 如果使用 step
list1[start:stop:step]

  • 切片结果包含 start 索引,但不包含 stop 索引
  • start/stop 索引可以省略,如果省略,则默认为序列从开始到结束,如 list1 == list1[:]

step 的应用:

# 取出奇数位置的元素
list1[::2]
# 反转字符串
str1[::-1]

字典(哈希表)

# 创建字典
dict1 = {'key1': 'value1', 2: [3, 2]}
# 从序列创建字典
dict(zip(KeyList, ValueList))
# 获取/设置/插入元素
dict1['key1']
dict1['key1'] = 'NewValue'
# get 提供默认值
dict1.get('key1', DefaultValue)
# 检查键是否存在
'key1' in dict1
# 获取键列表
dict1.keys()
# 获取值列表
dict1.values()
# 更新值
dict1.update(dict2)  # dict1 的值被 dict2 替换
  • 如果键不存在,则会出现 KeyError Exception
  • 当键不存在时,如果 get()不提供默认值则会返回 None
  • 以相同的顺序返回键列表和值列表,但顺序不是特定的,也就是说极大可能非排序。

有效字典键类型

  • 键必须是不可变的,比如标量类型(intfloatstring)或者元组(元组中的所有对象也必须是不可变的)。
  • 这儿涉及的技术术语是“可哈希(hashability)”。可以用函数hash()来检查一个对象是否是可哈希的,比如 hash('This is a string')会返回一个哈希值,而hash([1,2])则会报错(不可哈希)。

集合

  • 一个集合是一些无序且唯一的元素的聚集;
  • 你可以把它看成只有键的字典;

    # 创建集合
    set([3, 6, 3])
    {3, 6, 3}
    # 子集测试
    set1.issubset(set2)
    # 超集测试
    set1.issuperset(set2)
    # 测试两个集合中的元素是否完全相同
    set1 == set2
  • 集合操作

    • 并(或):set1 | set2
    • 交(与):set1 & set2
    • 差:set1 - set2
    • 对称差(异或):set1 ^ set2

函数

Python 的函数参数传递是通过引用传递

  • 基本形式

    def func1(posArg1, keywordArg1=1, ..)
    

    • 关键字参数必须跟在位置参数的后面;
    • 默认情况下,Python 不会“延迟求值”,表达式的值会立刻求出来。
  • 函数调用机制

    1. 所有函数均位于模块内部作用域。见“模块”部分。
    2. 在调用函数时,参数被打包成一个元组和一个字典,函数接收一个元组args和一个字典kwargs,然后在函数内部解包。
  • “函数是对象”的常见用法:

    def func1(ops = [str.strip, user_define_func, ..], ..):
    for function in ops:
    value = function(value)

返回值

  • 如果函数直到结束都没有return语句,则返回None
  • 如果有多个返回值则通过一个元组来实现。 python return (value1, value2)
    value1, value2 = func1(..)

匿名函数(又称 LAMBDA 函数)

  • 什么是匿名函数?

匿名函数是一个只包含一条语句的简单函数。

lambda x : x * 2
# def func1(x) : return x * 2
  • 匿名函数的应用:“柯里化(curring)”,即利用已存在函数的部分参数来派生新的函数。 python ma60 = lambda x : pd.rolling_mean(x, 60)

一些有用的函数(针对数据结构)

  1. Enumerate 返回一个序列(i, value)元组,i 是当前 item 的索引。

    for i, value in enumerate(collection):
    
    • 应用:创建一个序列中值与其在序列中的位置的字典映射(假设每一个值都是唯一的)。
  2. Sorted 可以从任意序列中返回一个排序好的序列。

    sorted([2, 1, 3]) => [1, 2, 3]
    
    • 应用: python sorted(set('abc bcd')) => [' ', 'a', 'b', 'c', 'd']
      # 返回一个字符串排序后无重复的字母序列
  3. Zip 函数可以把许多列表、元组或其他序列的元素配对起来创建一系列的元组。

    zip(seq1, seq2) => [('seq1_1', 'seq2_1'), (..), ..]
    
    • zip()可以接收任意数量的序列作为参数,但是产生的元素的数目取决于最短的序列。
    • 应用:多个序列同时迭代:

      for i, (a, b) in enumerate(zip(seq1, seq2)):
      
    • unzip:另一种思考方式是把一些行转化为一些列:

      seq1, seq2 = unzip(zipOutput)
      
  4. Reversed 将一个序列的元素以逆序迭代。

    list(reversed(range(10)))
    

    reversed() 会返回一个迭代器,list() 使之成为一个列表。

控制流

  1. 用于 if-else 条件中的操作符:
    ```python
    var1 is var2 # 检查两个变量是否是相同的对象

var1 is not var2 # 检查两个变量是否是不同的对象

var1 == var2 # 检查两个变量的值是否相等

> **注**:Python 中使用 `and`、`or`、`not` 来组合条件,而不是使用 `&&`、`||`、`!` 。

2. `for`循环的常见用法:
```python
for element in iterator:  # 可迭代对象(list、tuple)或迭代器
    pass

for a, b, c in iterator:  # 如果元素是可以解包的序列
    pass
  1. pass:无操作语句,在不需要进行任何操作的块中使用。
  2. 三元表达式,又称简洁的 if-else,基本形式:

    value = true-expr if condition else false-expr
    
  3. Python 中没有 switch/case 语句,请使用 if/elif

面向对象编程

  1. 对象是 Python 中所有类型的根。
  2. 万物(数字、字符串、函数、类、模块等)皆为对象,每个对象均有一个“类型(type)”。对象变量是一个指向变量在内存中位置的指针。
  3. 所有对象均会被引用计数

    sys.getrefcount(5) => x
    a = 5, b = a
    # 上式会在等号的右边创建一个对象的引用,因此 a 和 b 均指向 5
    sys.getrefcount(5)
    => x + 2
    del(a); sys.getrefcount(5) => x + 1
  4. 类的基本形式:

    class MyObject(object):
    # 'self' 等价于 Java/C++ 中的 'this'
    def __init__(self, name):
    self.name = name
    def memberFunc1(self, arg1):
    pass
    @staticmethod
    def classFunc2(arg1):
    pass
    obj1 = MyObject('name1')
    obj1.memberFunc1('a')
    MyObject.classFunc2('b')
  5. 有用的交互式工具:

    dir(variable1)  # 列出对象的所有可用方法
    

常见字符串操作

# 通过分隔符连接列表/元组
', '.join([ 'v1', 'v2', 'v3']) => 'v1, v2, v3'

# 格式化字符串
string1 = 'My name is {0} {name}'
newString1 = string1.format('Sean', name = 'Chen')

# 分裂字符串
sep = '-';
stringList1 = string1.split(sep)

# 获取子串
start = 1;
string1[start:8]

# 补 '0' 向右对齐字符串
month = '5';
month.zfill(2) => '05'
month = '12';
month.zfill(2) => '12'
month.zfill(3) => '012'

异常处理

  1. 基本形式:

    try:
    pass
    except ValueError as e:
    print e
    except (TypeError, AnotherError):
    pass
    except:
    pass
    finally:
    pass # 清理,比如 close db;
  2. 手动引发异常:

    raise AssertionError  # 断言失败
    raise SystemExit
    # 请求程序退出
    raise RuntimeError('错误信息 :..')

列表、字典以及元组的推导表达式

使代码更加易读易写的语法糖。

  1. 列表推导

    • 用一个简练的表达式,通过筛选一个数据集并且转换经过筛选的元素的方式来简明地生成新列表。
    • 基本形式: python [expr for val in collection if condition] 等价于 python result = []
      for val in collection:
      if condition:
      result.append(expr)
      可以省略过滤条件,只留下表达式。
  2. 字典推导

    • 基本形式: python {key-expr : value-expr for value in collection if condition}
  3. 集合推导

    • 基本形式:和列表推导一样,不过是用 () 而不是 []
  4. 嵌套列表

    • 基本形式: python [expr for val in collection for innerVal in val if condition]

单元测试

Python自带unittest模块,可供我们编写单元测试。

import unittest

我们可以编写继承于unittest.TestCase测试类的子类,并在子类中编写具体的测试函数。测试函数命必须以test_开头,否则不会被识别为测试函数,进而不会在运行单元测试时被运行。

class TestSubclass(unittest.TestCase):

    def test_func(self):
        self.assertEqual(0, 0)
        # 可以通过msg关键字参数提供测试失败时的提示消息
        self.assertEqual(0, 0, msg='modified message')
        self.assertGreater(1, 0)
        self.assertIn(0, [0])
        self.assertTrue(True)
        # 测试是否会抛出异常
        with self.assertRaises(KeyError):
            _ = dict()[1]

    # 被@unittest.skip装饰器装饰的测试类或测试函数会被跳过
    @unittest.skip(reason='just skip')
    def test_skip(self):
        raise Exception('I shall never be tested')

另外,unittest.TestCase中还有两个特殊的成员函数,他们分别会在调用每一个测试函数的前后运行。在测试前连接数据库并在测试完成后断开连接是一种常见的使用场景。

def setUp(self):
    # To do: connect to the database
    pass

def tearDown(self):
    # To do: release the connection
    pass

def test_database(self):
    # To do: test the database
    pass

测试类编写完毕后,可以通过添加以下代码来将当前文件当成正常的Python脚本使用

if __name__ == '__main__':
  unittest.main()

Python数据科学速查表

Python数据科学速查表

2020/02/21 posted in  基础

1. python简介及安装

python简介

编程语言是用来定义 计算机程序 的形式语言。我们通过编程语言来编写程序代码,再通过语言处理程序执行向计算机发送指令,让计算机完成对应的工作。

Python也是编程语言的一种,并且是高级的编程语言。Python语言可能是第一种即简单又功能强大的编程语言。

python的优点

  1. 简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。

  2. 易学:就如同你即将看到的一样,Python极其容易上手。前面已经提到了,Python有极其简单的语法。

  3. 免费、开源:Python是FLOSS(自由/开放源码软件)之一。简单地说,你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。这是为什什么Python如此优秀的原因之一—它是由一群希望看到一个更更加优秀的Python的人创造并经常改进着的。

  4. 层语言:当你用Python语言编写程序的时候,你无需考虑诸如如何管理理你的程序使用的内存一类的底层细节。

  5. 可移植性:由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程无需修改就可以在下述任何平台上面运行。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC、Symbian以及Google基于linux开发的Android平台!

  6. 解释性:这一点需要一些解释。一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不不需要编译成二进制代码。你可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用Python更更加简单。由于你只需要把你的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。

  7. 面向对象:Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。

  8. 可扩展性:如果你需要你的一段关键代码运行得更快或者希望某些算法不不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。

  9. 丰富的库:Python标准库确实很庞大。它可以帮助你处理理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。

  10. 规范的代码:Python采用强制缩进的方式使得代码具有极佳的可读性。

pycharm安装激活

PyCharm是一 Python IDE,带有一 整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、 代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了-些高级功能,以用于支持Django框架下的专业Web开发。

下载安装

官方下载地址

激活

激活方式均选择License server。

第一服务器License server address: http://39.105.114.41:1027

第二服务器License server address: http://36.110.99.11:3456

以上两台服务器任选一台。

使用Anconda方式安装Python环境

Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。 因为包含了大量的科学包,Anaconda 的下载文件比较大(约 600 MB),如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版(仅包含conda和 Python)。

下载

Python3.6版本

安装

根据安装步骤下一步安装完成即可

anaconda自带python3.6环境不需要自己再次去官网下载python了。

注意: Windows如果忘记勾选添加环境变量选项需要可以进行一下操作



注意: Mac 添加环境变量

export PATH="~/anaconda3/bin:$PATH"

或者

vim~/.bash_profile

点进入编辑模式,进行编辑然后添加

export PATH="~/anaconda3/bin:$PATH"

编辑完成后,点esc 退出

直接输入 ::wq! 这四个字符后,回车即可保存。

使用

界面介绍

工具介绍

添加快捷键

创建jupyter虚拟环境

Windows

conda关于环境的几个常用命令

anaconda国内下载源:https://repo.continuum.io/archive/

查看当前的环境列列表:

$ conda env list

创建新的python环境,并且还可以指定python的版本

$ conda create -n myenv python=3.7 激活、进入某个环境: $ activate test 退出环境: $ deactivate

删除环境: $ conda remove --name test --all

创建想要添加的虚拟环境

conda create -n myenv python=3.5

创建好以后可以在C:\ProgramData\Anaconda3\envs\(具体与自己安装的anaconda路路径为准) 下找到新创建的环境

将新的环境添加到jupyter中

第一:首先到C:\ProgramData\Anaconda3\share\jupyter\kernels 文件夹下,会有一个自带的Python3文件夹;

第二:然后在Python3 文件夹同级目录下创建一个文件夹test文件夹(名字自己随便取,记得是英文);

第三:将Python3文件夹下的kernel.json文件复制到test文件夹下;

第四:用记事本打开后

{ "argv": [ "C:\\ProgramData\\Anaconda3\\python.exe", "-m", "ipykernel_launcher", "-f", "
{connection_file}" ], "display_name": "Python 3", "language": "python" }

将路径改成新创建的环境路路径,然后Python 3改成jupyter中想显示的名字。

第五:重启jupyter-notebook,选择新建会出现你想要的环境。

安装ipykernel库

第一: activate myenv 激活你的虚拟环境

第二: conda install ipykernel , 中间会出现<[y]/n>? 在后面直接输入y,回车。

重启jupyter即可

Mac

mac中激活和退出某个环境的命令

激活、进入某个环境:
$ source activate test

注意: 最新的anaconda 命令改成了conda activate test
退出环境: $ source deactivate

注意: 最新的anaconda 命令改成了conda deactivate

创建想要添加的虚拟环境

$ conda create -n myenv python=3.5

查找kernel.json文件

$ find . -name "kernel.json"

第一:然后在 ./Library/Jupyter/kernels/ 目录下手动创建一个文件夹,然后创建一个名为 kernel.json 的文件,让该文件和已有的虚拟环境相关联,即可使用该虚拟环境。该json文件的内容大概如此:/Users/mac/Library/Jupyter/kernels/python37

{ "display_name": "py35", "language": "python", "argv": [ "/Users/mac/Library/Jupyter/kernels/python37/bin/python", "-m", "ipykernel_launcher", "-f", "{connection_file}" ] }

第二: 重启jupyter,就会出现新的环境

注意: 上面操作完成之后,会提示/Users/mac/anaconda3/envs/python37/bin/python3.7: No module named ipykernel_launcher

第三:激活虚拟环境,然后conda install ipykernel

第四: 重启

Anaconda安装拓拓展

第一: 终端输入

$ pip install jupyter_contrib_nbextensions
$ pip install jupyter_nbextensions_configurator
$ jupyter contrib nbextension install --user

第二: 重启jupyter

关 于 插 件 的 介 绍

例如: Hinterland 代码提示

jupyter汉化问题

Mac

jupyter在浏览器器的显示语言是根据终端语言自适应的,如果你的终端是中文,那么启动jupyter后,浏览器器就以中文显示

  1. 终端是中文状态,jupyter是中文

  1. 如果想显示英文,有两种方式可以设置

一种是临时的

终端中依次输入以下命令:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

然后在当前终端输入jupyter notebook 启动jupyter;

注意:以上的命令设置只对当前终端生效,如果在新的终端启动jupyter,还是会显示中文,目前没有对所有终端生效的方法。

一种是永久的

  1. 在终端中输入locale查看系统默认的语言设置;
  2. 使用vim编辑bash_profile文件,修改设置,终端输入 vim~/.bash_profile

  1. 在最后一行添加export LANG=en_US.UTF-8这一行

  2. 保存文件退出,然后在终端输入source ~/.bash_profile ,让设置生效,然后启动

windows

windows中在cmd中启动jupyter,默认以英文显示,如果想要中文,需要下载git。

  1. 下载地址:https://www.git-scm.com/download/win
  2. 一路路next,进行安装;
  3. 安装完毕,搜索git bash并打开;
  4. 打开Git bash输入命令jupyter notebook启动jupyter.
2020/02/21 posted in  基础

2. numpy

NumPy介绍

Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。
Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。
Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器。

NumPy优点

  1. 快速
  2. 方便
  3. 科学计算的基础库

  • 对于同样的数值计算任务,使用NumPy要比直接编写Python代码便捷得多;

  • NumPy中的数组的存储效率和输入输出性能均远远优于Python中等价的基本数据结构,且其能够提升的性能是 与数组中的元素成比例的;

  • NumPy的大部分代码都是用C语言写的,其底层算法在设计时就有着优异的性能,这使得NumPy比纯Python代 码高效得多

安装

pip install numpy

与原生list运算效率对比

import random 
import time 
import numpy as np
a = []
for i in range(100000000): 
    a.append(random.random())
t1 = time.time() 
sum1=sum(a) 
t2=time.time()

b=np.array(a) 
t4=time.time() 
sum3=np.sum(b) 
t5=time.time() 

print(t2-t1, t5-t4)
45.5947265625 2.542968988418579

NumPy 的Ndarray 对象

NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。

创建一维数组

多种样式创建一维数组

直接传入列表

import numpy as np
list=[1,2,3,4]
Array_1=np.array(list)
print(Array_1,type(Array_1))
[1 2 3 4] <class 'numpy.ndarray'>

传入range生成序列

Array_2=np.array(range(1,10))
print(Array_2,type(Array_2))
[1 2 3 4 5 6 7 8 9] <class 'numpy.ndarray'>

利用numpy自带的np.arange()

Array_3=np.arange(1,10)
print(Array_3,type(Array_3))
[1 2 3 4 5 6 7 8 9] <class 'numpy.ndarray'>

创建二维数组

list2=[[1,2,3],[4,5,6],[7,8,9]]

t1=np.array(list2)
print(t1,type(t1))
[[1 2 3]
 [4 5 6]
 [7 8 9]] <class 'numpy.ndarray'>

常用属性

# 获取数组的维度(与函数的参数相似)
print(t1.ndim)
2
#形状(行,列)
print(t1.shape)
(3, 3)
#元素个数
print(t1.size)
9

调整数组的形状

t2= np.array([[1,2,3],[4,5,6]])
# 修改的是原有的four.shape = (3,2)
print(t2)

# 返回一个新的数组
t2 = t2.reshape(3,2) 
print(t2)

# 将多维变成一维数组
t3= t2.reshape((6,),order='F')
# 默认情况下‘C’以行为主的顺序展开,‘F’(Fortran风格)意味着以列的顺序展开

t4 = t2.flatten(order='F') 
print(t3)
print(t4)

[[1 2 3]
 [4 5 6]]
[[1 2]
 [3 4]
 [5 6]]
[1 3 5 2 4 6]
[1 3 5 2 4 6]
# 拓展:数组的形状
t = np.arange(24)
print(t) 
print(t.shape)


# 转换成二维
t1 = t.reshape((4,6))
print(t1) 
print(t1.shape)


# 转成三维
t2 = t.reshape((2,3,4)) 
print(t2) 
print(t2.shape)

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
(24,)
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
(4, 6)
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
(2, 3, 4)

将数组转成list

a= np.array([9, 12, 88, 14, 25])
list_a = a.tolist() 
print(list_a) 
print(type(list_a))

[9, 12, 88, 14, 25]
<class 'list'>

NumPy的数据类型

f = np.array([1,2,3,4,5], dtype = np.int16)

# 返回数组中每个元素的字节单位长度
print(f.itemsize) # 1 np.int8(一个字节)

2
# 获取数据类型
print(f.dtype)

int16
# 调整数据类型
f1 = f.astype(np.int64) 
print(f1.dtype)

int64
# 拓展随机生成小数
# 使用python语法,保留两位
print(round(random.random(),2))

arr = np.array([random.random() for i in range(10)])
# 取小数点后两位
print(np.round(arr,2))


0.02
[0.29 0.82 0.01 0.23 0.89 0.46 0.44 0.4  0.58 0.17]
类型 说明
bool 用一个字节存储的布尔类型(True或False)
inti 由所在平台决定其大小的整数(一般为int32或int64)
int8 一个字节大小,-128 至 127
int16 整数,-32768 至 32767
int32 整数,-2 ** 31 至 2 ** 32 -1
int64 整数,-2 ** 63 至 2 ** 63 - 1
uint8 无符号整数,0 至 255
uint16 无符号整数,0 至 65535
uint32 无符号整数,0 至 2 ** 32 - 1
uint64 无符号整数,0 至 2 ** 64 - 1
float16 半精度浮点数:16位,正负号1位,指数5位,精度10位
float32 单精度浮点数:32位,正负号1位,指数8位,精度23位
float64或float 双精度浮点数:64位,正负号1位,指数11位,精度52位
complex64 复数,分别用两个32位浮点数表示实部和虚部
complex128或complex 复数,分别用两个64位浮点数表示实部和虚部

数组的计算

数组和数的计算

由于numpy的广播机机制在运算过程中,加减乘除的值被广播到所有的元素上面。

t1 = np.arange(24).reshape((6,4)) 
print(t1+2)
print(t1*2) 
print(t1/2)

[[ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]
 [14 15 16 17]
 [18 19 20 21]
 [22 23 24 25]]
[[ 0  2  4  6]
 [ 8 10 12 14]
 [16 18 20 22]
 [24 26 28 30]
 [32 34 36 38]
 [40 42 44 46]]
[[ 0.   0.5  1.   1.5]
 [ 2.   2.5  3.   3.5]
 [ 4.   4.5  5.   5.5]
 [ 6.   6.5  7.   7.5]
 [ 8.   8.5  9.   9.5]
 [10.  10.5 11.  11.5]]

数组与数组之间的操作

同种形状的数组(对应位置进行计算操作)

t1 = np.arange(24).reshape((6,4))
t2 = np.arange(100,124).reshape((6,4))

print(t1+t2) 
print(t1*t2)

[[100 102 104 106]
 [108 110 112 114]
 [116 118 120 122]
 [124 126 128 130]
 [132 134 136 138]
 [140 142 144 146]]
[[   0  101  204  309]
 [ 416  525  636  749]
 [ 864  981 1100 1221]
 [1344 1469 1596 1725]
 [1856 1989 2124 2261]
 [2400 2541 2684 2829]]

不种形状的多维数组不能计算

t1 = np.arange(24).reshape((4,6)) 
t2 = np.arange(18).reshape((3,6)) 
print(t1)
print(t2) 
print(t1-t2)

[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]]




---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-32-8e6819c2b1e3> in <module>()
      3 print(t1)
      4 print(t2)
----> 5 print(t1-t2)



ValueError: operands could not be broadcast together with shapes (4,6) (3,6) 

行数或者列数相同的一维数组和多维数组可以进行计算:

行形状相同(会与每一行数组的对应位相操作)

t1 = np.arange(24).reshape((4,6)) 
t2 = np.arange(0,6)

print(t1-t2)


[[ 0  0  0  0  0  0]
 [ 6  6  6  6  6  6]
 [12 12 12 12 12 12]
 [18 18 18 18 18 18]]

列形状相同(会与每一个相同维度的数组的对应位相操作)

t1 = np.arange(24).reshape((4,6)) 
t2 = np.arange(4).reshape((4,1))

print(t1-t2)


[[ 0  1  2  3  4  5]
 [ 5  6  7  8  9 10]
 [10 11 12 13 14 15]
 [15 16 17 18 19 20]]

数组中的轴

  1. 什么是轴: 在numpy中可以理解为方向,使用0,1,2数字表示,对于一个一维数组,只有一个0轴, 对于2维数组(shape(2,2))有0轴和1轴, 对于3维数组(shape(2,2,3))有0,1,2轴

  2. 为什么要学习轴:有了轴的概念后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值。

20191127155610

20191127155642

import numpy as np
a = np.array([[1,2,3],[4,5,6]])

print(np.sum(a,axis=0)) # [5 7 9]

print(np.sum(a,axis = 1)) # [ 6 15]

print(np.sum(a))# 计算所有的值的和


[5 7 9]
[ 6 15]
21
#三维的数据
a = np.arange(27).reshape((3,3,3))
print(a)

[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]]

 [[ 9 10 11]
  [12 13 14]
  [15 16 17]]

 [[18 19 20]
  [21 22 23]
  [24 25 26]]]
b = np.sum(a, axis=0)
print(b)


[[27 30 33]
 [36 39 42]
 [45 48 51]]
c = np.sum(a, axis=1)
print(c)

[[ 9 12 15]
 [36 39 42]
 [63 66 69]]
c = np.sum(a, axis=2)
print(c)

[[ 3 12 21]
 [30 39 48]
 [57 66 75]]

总结:在计算的时候可以想象成是每一个坐标轴,分别计算这个轴上面的每一个刻度上的值,或者在二维数组中记住0表示列1表示行.

数组的索引和切片

一维数组的操作方法

import numpy as np

a = np.arange(10)
# 冒号分隔切片参数 start:stop:step 来进行切片操作

print(a[2:7:2])# 从索引 2 开始到索引 7 停止,间隔为 2

# 如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素
print(a[2],a)

# 如果为 [2:],表示从该索引开始以后的所有项都将被提取
print(a[2:])


[2 4 6]
2 [0 1 2 3 4 5 6 7 8 9]
[2 3 4 5 6 7 8 9]

多维数组的操作方法

import numpy as np
t1 = np.arange(24).reshape(4,6) 
print(t1)
print('*'*20)
print(t1[1]) # 取一行(一行代表是一条数据,索引也是从0开始的) 
print(t1[1,:]) # 取一行

print(t1[1:])# 取连续的多行
print(t1[1:3,:])# 取连续的多行

print(t1[[0,2,3]])# 取不连续的多行
print(t1[[0,2,3],:])# 取不连续的多行

print(t1[:,1])# 取一列
print(t1[:,1:])# 连续的多列
print(t1[:,[0,2,3]])# 取不连续的多列
print(t1[2,3])# # 取某一个值,三行四列
print(t1[[0,1,1],[0,1,3]])# 取多个不连续的值,[[行,行。。。],[列,列。。。]]

[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
********************
[ 6  7  8  9 10 11]
[ 6  7  8  9 10 11]
[[ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
[[ 6  7  8  9 10 11]
 [12 13 14 15 16 17]]
[[ 0  1  2  3  4  5]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
[[ 0  1  2  3  4  5]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
[ 1  7 13 19]
[[ 1  2  3  4  5]
 [ 7  8  9 10 11]
 [13 14 15 16 17]
 [19 20 21 22 23]]
[[ 0  2  3]
 [ 6  8  9]
 [12 14 15]
 [18 20 21]]
15
[0 7 9]

组中的数值修改

t = np.arange(24).reshape(4,6)

# 修改某一行的值
t[1,:]=0

# 修改某一列的值
t[:,1]=0

# 修改连续多行
t[1:3,:]=0

# 修改连续多列
t[:,1:4]=0

# 修改多行多列,取第二行到第四行,第三列到第五列
t[1:4,2:5]=0

# 修改多个不相邻的点
t[[0,1],[0,3]]=0

# 可以根据条件修改,比如讲小于10的值改掉
t[t<10]=0

# 使用逻辑判断
# np.logical_and    & 
# np.logical_or |
# np.logical_not        ~ 

t[(t>2)&(t<6)]=0    # 与
t[(t<2)|(t>6)]=0    # 或
t[~(t>6)]=0 # 非
print(t)

# 拓 展
# 三目运算( np.where(condition, x, y)满足条件(condition),输出x,不满足输出y。))
# score = np.array([[80,88],[82,81],[75,81]])
# result = np.where(score>80,True,False) 
# print(result)

[[0 0 0 0 0 0]
 [0 0 0 0 0 0]
 [0 0 0 0 0 0]
 [0 0 0 0 0 0]]

数组的添加、删除和去重

数组的添加

  1. numpy.append 函数在数组的末尾添加值。 追加操作会分配整个数组,并把原来的数组复制到新数组中。 此外,输入数组的维度必须匹配否则将生成ValueError。

参数说明:

  • arr:输入数组
  • values:要向arr添加的值,需要和arr形状相同(除了要添加的轴)
  • axis:默认为 None。当axis无定义时,是横向加成,返回总是为一维数组!当axis有定义的时候,分别为0和1的时候。当
  • axis有定义的时候,分别为0和1的时候(列数要相同)。当axis为1时,数组是加在右边(行数要相同)。
a = np.array([[1,2,3],[4,5,6]])

print ('第一个数组:')
print (a)
print ('\n')

print (' 向 数 组 添 加 元 素 :') 
print (np.append(a, [7,8,9])) 
print ('\n')

print ('沿轴 0 添加元素:')
print (np.append(a, [[7,8,9]],axis = 0)) 
print ('\n')

print ('沿轴 1 添加元素:')
print (np.append(a, [[5,5,5],[7,8,9]],axis = 1))


第一个数组:
[[1 2 3]
 [4 5 6]]



​ 向 数 组 添 加 元 素 :
​ [1 2 3 4 5 6 7 8 9]



​ 沿轴 0 添加元素:
​ [[1 2 3]
​ [4 5 6]
​ [7 8 9]]



​ 沿轴 1 添加元素:
​ [[1 2 3 5 5 5]
​ [4 5 6 7 8 9]]

  1. numpy.insert 函数在给定索引之前,沿给定轴在输入数组中插入值。

    如果值的类型转换为要插入,则它与输入数组不同。 插入没有原地的,函数会返回一个新数组。 此外,如果未提供轴,则输入数组会被展开。

a = np.array([[1,2],[3,4],[5,6]])

print ('第一个数组:') 
print (a)
print ('\n')

print ('未传递 Axis 参数。 在插入之前输入数组会被展开。') 
print (np.insert(a,3,[11,12]))
print ('\n')
print ('传递了 Axis 参数。 会广播值数组来配输入数组。')

print ('沿轴  0 广播:')
print (np.insert(a,1,[11],axis = 0)) 
print ('\n')

print ('沿轴  1 广播:')
print (np.insert(a,1,11,axis = 1))


第一个数组:
[[1 2]
 [3 4]
 [5 6]]



​ 未传递 Axis 参数。 在插入之前输入数组会被展开。
​ [ 1 2 3 11 12 4 5 6]



​ 传递了 Axis 参数。 会广播值数组来配输入数组。
​ 沿轴 0 广播:
​ [[ 1 2]
​ [11 11]
​ [ 3 4]
​ [ 5 6]]



​ 沿轴 1 广播:
​ [[ 1 11 2]
​ [ 3 11 4]
​ [ 5 11 6]]

数组中的删除

numpy.delete 函数返回从输入数组中删除指定子数组的新数组。 与 insert() 函数的情况一样,如果未提供轴参数, 则输入数组将展开。

参数说明:

  • arr: 输入数组

  • obj:可以被切片,整数或者整数数组,表明要从输入数组删除的子数组

  • axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开

a = np.arange(12).reshape(3,4)
print ('第一个数组:')
print (a)
print ('\n')

print ('未传递 Axis 参数。 在删除之前输入数组会被展开。') 
print (np.delete(a,5))
print ('\n')

print ('删除每一行中的第二列:')
print (np.delete(a,1,axis = 1)) 
print ('\n')


第一个数组:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]



​ 未传递 Axis 参数。 在删除之前输入数组会被展开。
​ [ 0 1 2 3 4 6 7 8 9 10 11]



​ 删除每一行中的第二列:
​ [[ 0 2 3]
​ [ 4 6 7]
​ [ 8 10 11]]



数组去重

numpy.unique 函数用于去除数组中的重复元素。

  • arr:输入数组 ,如果不是一维数组则会展开 * return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储
  • return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储
  • return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数
a = np.array([5,2,6,2,7,5,6,8,2,9])
print ('第一个数组:') 
print (a)
print ('\n')

print ('第一个数组的去重值:') 
u = np.unique(a)
print (u)
print ('\n')


print ('去重数组的索引数组:')
u,indices = np.unique(a, return_index = True) 
print (indices)
print ('\n')

print ('我们可以看到每个和原数组下标对应的数值:') 
print (a)
print ('\n')

print ('去重数组的下标:')
u,indices = np.unique(a,return_inverse = True) 
print (u)
print (indices) 
print ('\n')

print ('返回去重元素的重复数量:')
u,indices = np.unique(a,return_counts = True) # print (u)
print (indices)

第一个数组:
[5 2 6 2 7 5 6 8 2 9]



​ 第一个数组的去重值:
​ [2 5 6 7 8 9]



​ 去重数组的索引数组:
​ [1 0 2 4 7 9]



​ 我们可以看到每个和原数组下标对应的数值:
​ [5 2 6 2 7 5 6 8 2 9]



​ 去重数组的下标:
​ [2 5 6 7 8 9]
​ [1 0 2 0 3 1 2 4 0 5]



​ 返回去重元素的重复数量:
​ [3 2 2 1 1 1]

numpy的计算

score = np.array([[80,88],[82,81],[75,81]])
print(score)

[[80 88]
 [82 81]
 [75 81]]

获取所有数据最大值

print(np.max(score))

88

获取某个轴上的数据最大值

print(np.max(score,axis=0))

[82 88]

获取最小值

print(np.min(score))

75

获取某个轴上最小值

print(np.min(score,axis=0))

[75 81]

数据的比较

t1=[1,2,3,4,5,6,7,8]
print(t1)

[1, 2, 3, 4, 5, 6, 7, 8]
print(np.maximum(t1,0)) # 第一个参数中的每一个数与第二个参数比较返回大的

[1 2 3 4 5 6 7 8]
print(np.minimum(t1,0))# 第一个参数中的每一个数与第二个参数比较返回小的

[0 0 0 0 0 0 0 0]
# 接受的两个参数,也可以大小一致;第二个参数只是一个单独的值时,其实是用到了维度的广播机制
print(np.maximum(t1,[2,4,6,8,9,1,3,5]))

[2 4 6 8 9 6 7 8]

求平均值

print(np.mean(t1))# 获取所有数据的平均值

4.5
print(np.mean(score,axis=0))

[79.         83.33333333]

求前缀和

arr = np.array([[1,2,3], [4,5,6]]) 
print(arr)
print('*'*20)
print('''
[1, 2, 3]------>    |  1   |  2   |  3  |
[4, 5, 6]------>    |5=1+4 |7=2+5 |9=3+6| ''')
print('*'*20)
print(arr.cumsum(0))

[[1 2 3]
 [4 5 6]]
********************

[1, 2, 3]------>    |  1   |  2   |  3  |
[4, 5, 6]------>    |5=1+4 |7=2+5 |9=3+6| 
********************
[[1 2 3]
 [5 7 9]]
print('''
[1, 2, 3]------>    |1  |2+1    |3+2+1  |
[4, 5, 6]------>    |4  |4+5    |4+5+6  | ''')
print('*'*20)
print(arr.cumsum(1)) 

[1, 2, 3]------>    |1  |2+1    |3+2+1  |
[4, 5, 6]------>    |4  |4+5    |4+5+6  | 
********************
[[ 1  3  6]
 [ 4  9 15]]

求最小索引值

print(np.argmin(score,axis=0))

[2 1]

求每一列的标准差

标准差是一组数据平均值分散程度的一种度量。一个较大的标准差,代表大部分数值和其平均值之间差异较大;

一个较小的标准差,代表这些数据较接近平均值反应出数据的波动稳定情况,越大表示波动越大,越不稳定。

print(np.std(score,axis=0))

[2.94392029 3.29983165]

极 值

np.ptp(score,axis=None)# 就是最大值和最小值的差

13

拓展

  • 方差var
  • 协方差cov
  • 计算平均值 average
  • 计算中位数 median

通用函数

函数 介绍
numpy.sqrt(array) 平方根函数
numpy.exp(array) earray[i]的数组
numpy.abs/fabs(array) 计算绝对值
numpy.square(array) 计算各元素的平方 等于array**2
numpy.log/log10/log2(array) 计算各元素的各种对数
numpy.sign(array) 计算各元素正负号
numpy.isnan(array) 计算各元素是否为NaN
numpy.isinf(array) 计算各元素是否为NaN
numpy.cos/cosh/sin/sinh/tan/tanh(array) 三角函数
numpy.modf(array) 将array中值得整数和小数分离,作两个数组返回
numpy.ceil(array) 向上取整,也就是取比这个数大的整数
numpy.floor(array) 向下取整,也就是取比这个数小的整数
numpy.rint(array) 四舍五入
numpy.trunc(array) 向0取整
numpy.cos(array) 正弦值
numpy.sin(array) 余弦值
numpy.tan(array) 正切值
numpy.add(array1,array2) 元素级加法
numpy.subtract(array1,array2) 元素级减法
numpy.multiply(array1,array2) 元素级乘法
numpy.divide(array1,array2) 元素级除法 array1./array2
numpy.power(array1,array2) 元素级指数 array1.array2
numpy.maximum/minimum(array1,aray2) 元素级最大值
numpy.fmax/fmin(array1,array2) 元素级最大值,忽略NaN
numpy.mod(array1,array2) 元素级求模
numpy.copysign(array1,array2) 将第二个数组中值得符号复制给第一个数组中值
numpy.greater/greater_equal/less/less_equal/equal/not_equal (array1,array2) 元素级比较运算,产生布尔数组
numpy.logical_end/logical_or/logic_xor(array1,array2) 元素级的真值逻辑运算

数组的拼接

有的时候我们需要将两个数据加起来一起研究分析,我们就可以将其进行拼接然后分析

根据轴连接的数组序列

a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])

#要求a,b两个数组的维度相同
print ('沿轴 0 连接两个数组:')
print (np.concatenate((a,b),axis= 0))
print ('\n')
print ('沿轴 1 连接两个数组:')
print (np.concatenate((a,b),axis = 1))

沿轴 0 连接两个数组:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]



​ 沿轴 1 连接两个数组:
​ [[1 2 5 6]
​ [3 4 7 8]]

根据轴进行堆叠

print ('沿轴 0 连接两个数组:')
print (np.stack((a,b),axis= 0))
print ('\n')
print ('沿轴 1 连接两个数组:')
print (np.stack((a,b),axis = 1))

沿轴 0 连接两个数组:
[[[1 2]
  [3 4]]

 [[5 6]
  [7 8]]]



​ 沿轴 1 连接两个数组:
​ [[[1 2]
​ [5 6]]


​ [[3 4]
​ [7 8]]]

矩阵垂直拼接

v1 = [[0,1,2,3,4,5],
    [6,7,8,9,10,11]] 

v2 = [[12,13,14,15,16,17],
    [18,19,20,21,22,23]] 

result = np.vstack((v1,v2)) 
print(result)

[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

矩阵水平拼接

result = np.hstack((v1,v2)) 
print(result)

[[ 0  1  2  3  4  5 12 13 14 15 16 17]
 [ 6  7  8  9 10 11 18 19 20 21 22 23]]

数组的分割

将一个数组分割为多个子数组

参数说明:

  • ary: 被分割的数组
  • indices_or_sections:果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)
  • axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分
arr = np.arange(9).reshape(3,3)
print ('将数组分为三个大小相等的子数组:') 
b= np.split(arr,3)
print (b)

将数组分为三个大小相等的子数组:
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]

numpy.hsplit 函数用于水平分割数组,通过指定要返回的相同形状的数组数量来拆分原数组。

harr = np.floor(10 * np.random.random((2, 6))) #
print ('原array:')
print(harr)

print ('拆分后:')
print(np.hsplit(harr, 3))

原array:
[[6. 9. 3. 6. 1. 1.]
 [8. 3. 1. 7. 4. 5.]]
拆分后:
[array([[6., 9.],
       [8., 3.]]), array([[3., 6.],
       [1., 7.]]), array([[1., 1.],
       [4., 5.]])]

numpy.vsplit

沿着垂直轴分割

a = np.arange(16).reshape(4,4)
print ('第一个数组:') 
print (a)
print ('\n')

print ('竖直分割:')
b = np.vsplit(a,2) 
print (b)

第一个数组:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]



​ 竖直分割:
​ [array([[0, 1, 2, 3],
​ [4, 5, 6, 7]]), array([[ 8, 9, 10, 11],
​ [12, 13, 14, 15]])]

数组中nan和inf

C 语言中表示最大的正整数值是 0x7FFF FFFF,最小的负整数是 0x8000 0000。
查阅资料后,发现 inf 表示无穷大,需要使用 float(‘inf’) 函数来转化,那么对应的就有 float('-inf') 表示无穷小了。这样你就可以使用任意数来判断和它的关系了。

那什么时候会出现inf呢? 比如一个数字除以0,Python中会报错,但是numpy中会是一个inf或者-inf

另外还有 nan,这种写法在 pandans 中常见,表示缺失的数据,所以一般用 nan 来表示。任何与其做运算结果都是 nan

# 创建一个nan和inf 
a = np.nan 
b = np.inf
print(a,type(a)) 
print(b,type(b))

#--判断数组中为nan的个数
t = np.arange(24,dtype=float).reshape(4,6)

#将三行四列的数改成nan 
t[3,4] = np.nan

#可以使用np.count_nonzero() 来判断非零的个数
print(np.count_nonzero(t))
#并 且  np.nan != np.nan  结果 是TRUE
#所以我们可以使用这两个结合使用判断nan的个数
print(np.count_nonzero(t != t))

#将nan替换为0
t[np.isnan(t)] = 0 
print(t)

nan <class 'float'>
inf <class 'float'>
23
1
[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7.  8.  9. 10. 11.]
 [12. 13. 14. 15. 16. 17.]
 [18. 19. 20. 21.  0. 23.]]
#----------练习: 处理数组中nan
t = np.arange(24).reshape(4,6).astype('float')
#将数组中的一部分替换nan 
t[1,3:] = np.nan
print(t)
#遍历每一列,然后判断每一列是否有nan 
for i in range(t.shape[1]):
#   #获取当前列数据
    temp_col = t[:,i]
#
#   判断当前列的数据中是否含有nan
    nan_num = np.count_nonzero(temp_col != temp_col)
#
    if nan_num != 0: #条件成立说明含有nan 
    # 将这一列不为nan的数据拿出来
        temp_col_not_nan = temp_col[temp_col==temp_col]
# 将nan替换成这一列的平均值
        temp_col[np.isnan(temp_col)] = np.mean(temp_col_not_nan)
print(t)

[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7.  8. nan nan nan]
 [12. 13. 14. 15. 16. 17.]
 [18. 19. 20. 21. 22. 23.]]
[[ 0.  1.  2.  3.  4.  5.]
 [ 6.  7.  8. 13. 14. 15.]
 [12. 13. 14. 15. 16. 17.]
 [18. 19. 20. 21. 22. 23.]]

二维数组的转置

#对换数组的维度
a = np.arange(12).reshape(3,4) 
print ('原数组:')
print (a )
print ('\n')

print ('对换数组:')
print (np.transpose(a))

# 与transpose一致
a = np.arange(12).reshape(3,4)

print ('原数组:') 
print (a)
print ('\n')

print ('转置数组:') 
print (a.T)

# 函数用于交换数组的两个轴
t1 = np.arange(24).reshape(4,6)
re = t1.swapaxes(1,0) 
print (' 原 数 组 :') 
print (t1)
print ('\n')

print ('调用 swapaxes 函数后的数组:') 
print (re)

原数组:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]



​ 对换数组:
​ [[ 0 4 8]
​ [ 1 5 9]
​ [ 2 6 10]
​ [ 3 7 11]]
​ 原数组:
​ [[ 0 1 2 3]
​ [ 4 5 6 7]
​ [ 8 9 10 11]]



​ 转置数组:
​ [[ 0 4 8]
​ [ 1 5 9]
​ [ 2 6 10]
​ [ 3 7 11]]
​ 原 数 组 :
​ [[ 0 1 2 3 4 5]
​ [ 6 7 8 9 10 11]
​ [12 13 14 15 16 17]
​ [18 19 20 21 22 23]]

​ 调用 swapaxes 函数后的数组:
​ [[ 0 6 12 18]
​ [ 1 7 13 19]
​ [ 2 8 14 20]
​ [ 3 9 15 21]
​ [ 4 10 16 22]
​ [ 5 11 17 23]]

2020/02/21 posted in  常用库