1. NumPy的基础使用涵盖如下内容:

  数据类型

  数组类型

  类型转换

  创建数组

  数组索引

  数组切片

  改变维度

2. NumPy数组对象

  NumPy中的ndarray是一个多维数组对象,该兑现共有两部分组成:

  实际的数据

  描述这些数据的元数据。

  大部分的数组操作仅仅修改元数据部分而不改变底层的实际数据(其实就是一种浅拷贝理解)。

  ndarray支持更高的维度,因为数组一般是同质的,所以数组所有的元素类型必须是一致的。

  NumPy与Python一样数组的下标都是从0开始的。

  

  2.1 numpy.arange()创建数组和numpy.array()创建向量:

  dtype

import numpy as np

a = np.arange(5)
print(a.dtype)

  arange(开始值,结束值,dtype)

  dtype返回的是数据类型,这里返回的是int32或int64

  shape

import numpy as np

a = np.array([0,1,2,3,4])
print(a.shape) (5,)

  我们用shape返回向量的维度,这里是5行,列为空,返回值为元组类型。

  2.2 创建多维数组:

import numpy as np

a = np.array([np.arange(2),np.arange(2)])
print(a)
#[[0 1]
# [0 1]] print(a.shape)
#(2, 2)

 我们将arange函数创建的数组作为向量/列表的元素,把这个列表作为参数传递给array函数,从而创建了一个2*2的多维数组。

  2.3 选取数组元素

  有时候我们需要选取数组中的某个特定元素。喜爱宝是从0开始的

import numpy as np

a = np.array([[1,2],[3,4]])
print(a)
#[[1 2]
# [3 4]] print(a[0,0])
#1 print(a[1,1])
#4

  我们发现,在整个数组必须有一个大的括号包裹进里面的内容。

  2.4 数据类型

a = np.array([[1,2],[3,4]],dtype='f')

  这些类型有些资料可以查找。另外还可以指定复数数组。

  2.5 自定义数据类型和dtype类的属性

  查看占用字节数:

  itemsize

import numpy as np

a = np.array([[1,2],[3,4]],dtype='f')
print(a.dtype.itemsize) #4

  自定义数据类型用dtype,然后在调用:

import numpy as np

t = np.dtype([('name',str,),('numitems',int),('price',float)])
print(t)
#[('name', '<U40'), ('numitems', '<i4'), ('price', '<f8')]
print(t['name'])
#<U40
itemz = np.array([('Meaning of life DVD',,3.14),('Butter',,2.72)],dtype=t)
print(itemz[])
#('Butter', , 2.72) 

  

  2.6 一维数组的索引和切片:

import numpy as np

a = np.arange(9)
print(a)
#[0 1 2 3 4 5 6 7 8]
print(a[3:7])
#[3 4 5 6]
print(a[:7:2])
#[0 2 4 6]
print(a[::-1])
#[8 7 6 5 4 3 2 1 0]

  我们发现这和Python列表的索引和切片是一样的。

  2.7 多维数组的切片和索引

  reshape:表示三维坐标来选定任意一个,即楼层、行号、列号

import numpy as np

b0 = np.arange(24)
print(b0)
#[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
b = np.arange(24).reshape(2,3,4)
print(b)
#[[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
#
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]]
print(b.shape)
#(2, 3, 4) print(b[:,0,0])
#[ 0 12]

  

  2.8 改变数组的维度

  reshape(a,newshape,order='C')

  其中:

  a:数组-需要处理的数据。

  newshape:新格式-整数或数组(2,3)表示2行3列。新的形状应该与原来的形状金融。

  order:情况比前面两个参数有些复杂,这里会用比较大的篇幅解释,并在后面给出一个比较容易的示例。

  “C”指的是用类C写的读/索引顺序的元素,最后一个维度变化最快,第一个维度变化最慢。以二维数组为例,简单来讲就是横着读,横着写,优先读/写一行。

  “F”是指用FORTRAN类索引顺序读/写元素,最后一个维度变化最慢,第一个维度变化最快。竖着读,竖着写,优先读/写一列。注意,“C”和“F”选项不考虑底层数组的内存布局,只引用索引的顺序。

  “A”选项所生成的数组的效果与原数组a的数据存储方式有关,如果数据是按照FORTRAN存储的话,它的生成效果与”F“相同,否则与“C”相同。这里可能听起来有点模糊,下面会给出示例。

  注:FORTRAN和C是两个语言,他们存储数组的方式不同,FORTRSAN为列有限,而C为行优先。在python中默认数组生成的时候是按照C的方式进行存储。但,很多时候我们需要调用Fortran的一些库进行数学计算,所以需要让numpy生成的数组变成按照FORTRAN的方式存储。

import numpy as np

b0 = np.arange(4)
print(b0)
#[0 1 2 3] b1 = b0.reshape((2,2))
print(b1)
#[[0 1]
# [2 3]] b2 = np.arange(8) b3 = b2.reshape(2,2,2)
print(b3)
#[[[0 1]
# [2 3]]
#
# [[4 5]
# [6 7]]]

  

  ravel

  对矩阵进行展平操作:

import numpy as np

b0 = np.array([np.arange(2),np.arange(2)])
print(b0)
#
#[[0 1]
# [0 1]] print(b0.ravel())
#[0 1 0 1]

  flatten:

·  也是展平操作,与ravel函数的功能相同。但是flatten函数会请求分配内存来报错结果,而ravel函数知识返回数组的一个视图(view)

  resize

  与reshaple函数工呢狗一样,但是热死则会直接修改锁操作的数组。

  transpose

  转置操作,属于数组的运算:

import numpy as np

b0 = np.array([np.arange(2),np.arange(2)])
print(b0)
#
#[[0 1]
# [0 1]] print(b0.transpose())
#[[0 0]
# [1 1]]

  

  2.9 数组的组合

  vstack

  垂直组合

import numpy as np

a = np.arange(9).reshape(3,3)
print(a)
#[[0 1 2]
# [3 4 5]
# [6 7 8]] b = 2 * a
print(b)
#[[ 0 2 4]
# [ 6 8 10]
# [12 14 16]] print(np.vstack((a,b)))
#[[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 0 2 4]
# [ 6 8 10]
# [12 14 16]]

  dstack

  深度组合:就是将一系列数组沿着纵轴(深度)方向进行层叠组合。举个例子,有若干张二维平面内的图像点阵数据,我们可以讲这些图像数据沿着纵轴方向层叠一起,就香香的解释了什么是深度组合。

import numpy as np

a = np.arange(9).reshape(3,3)
print(a)
#[[0 1 2]
# [3 4 5]
# [6 7 8]] b = 2 * a
print(b)
#[[ 0 2 4]
# [ 6 8 10]
# [12 14 16]] print(np.dstack((a,b)))
#[[[ 0 0]
# [ 1 2]
# [ 2 4]]
#
# [[ 3 6]
# [ 4 8]
# [ 5 10]]
#
# [[ 6 12]
# [ 7 14]
# [ 8 16]]]

  

  hstack

  水平组合

import numpy as np

a = np.arange(9).reshape(3,3)
print(a)
#[[0 1 2]
# [3 4 5]
# [6 7 8]] b = 2 * a
print(b)
#[[ 0 2 4]
# [ 6 8 10]
# [12 14 16]] print(np.hstack((a,b)))
#[[ 0 1 2 0 2 4]
# [ 3 4 5 6 8 10]
# [ 6 7 8 12 14 16]]

  colum_stack

  列组合:column_stack函数对于一维数组将按照列方向进行组合。

import numpy as np

# 一维数组
oned = np.arange(2)
print(oned)
#[0 1] twice_oned = 2 * oned
print(twice_oned)
#[0 2] print(np.column_stack((oned,twice_oned)))
#[[0 0]
# [1 2]] # 二维数组:对于二维数组column_stack的效果是hstack的效果是一样的。

  

  row_stack:

  行组合:对于两个以为少数族直接层叠起来合成一个二维数组。

  concatenate:

  这个的效果和hstack的效果是一样的。

  2.10 数组的分割:

  hsplit:

  水平分割

import numpy as np

a = np.arange(9)
a = a.reshape(3,3)
print(a)
#[[0 1 2]
# [3 4 5]
# [6 7 8]] # 水平分割为3个大小相同的子数组
print(np.hsplit(a,3))
#[array([[0],
# [3],
# [6]]),
#array([[1],
# [4],
# [7]]),
#array([[2],
# [5],
# [8]])]

  

  vsplit

  垂直分割:

  dsplit

  深度分割:

  split

  默认分割

print(np.split(a,3,axis=1))

  1 = 垂直,0 =水平

  2.11 数组的属性

  ndim属性,给出数组的维数或者数组轴的个数

  size属性,给出数组元素的总个数

  itemsize属性,给出数组中的元素在内存中所占的字节数

  real属性,给出实部

  image属性,给出虚部

  flat属性将返回一个numpy.flatiter对象,这是获得flatiter对象的唯一方式,我们无法访问flatiter的构造函数。这个所谓“扁平迭代器”,可以让我们像遍历一维数组一样去遍历任意多维数组。

  2.12 数组的转换:

  tolist

  将numpy数组格式转换成python列表模式

import numpy as np

a = np.arange(9).reshape(3,3)
print(a)
#[[0 1 2]
# [3 4 5]
# [6 7 8]] b = a.tolist()
print(b,type(b))
# [6 7 8]]
#[[0, 1, 2], [3, 4, 5], [6, 7, 8]] <class 'list'>

    

  2.13 数组的运算

  加减乘除

  转置:transpose

  逆矩阵:linalg.inv()

import numpy as np

a = np.arange(9).reshape(3,3)
print(a)
#[[0 1 2]
# [3 4 5]
# [6 7 8]] b = np.linalg.pinv(a)
print(b) #[[-5.55555556e-01 -1.66666667e-01 2.22222222e-01]
# [-5.55555556e-02 2.01227923e-16 5.55555556e-02]
# [ 4.44444444e-01 1.66666667e-01 -1.11111111e-01]]

  对角线矩阵:eye

a = np.arange(9).reshape(3,3)
print(a)
#[[0 1 2]
# [3 4 5]
# [6 7 8]] b = np.eye(9,9)
print(b) #[[1. 0. 0. 0. 0. 0. 0. 0. 0.]
# [0. 1. 0. 0. 0. 0. 0. 0. 0.]
# [0. 0. 1. 0. 0. 0. 0. 0. 0.]
# [0. 0. 0. 1. 0. 0. 0. 0. 0.]
# [0. 0. 0. 0. 1. 0. 0. 0. 0.]
# [0. 0. 0. 0. 0. 1. 0. 0. 0.]
# [0. 0. 0. 0. 0. 0. 1. 0. 0.]
# [0. 0. 0. 0. 0. 0. 0. 1. 0.]
# [0. 0. 0. 0. 0. 0. 0. 0. 1.]]

  零矩阵:zeros

  空矩阵:empty

  三角矩阵:diag

import numpy as np

a = np.arange(9).reshape(3,3)
print(a)
#[[0 1 2]
# [3 4 5]
# [6 7 8]] b = np.diag((1,2,3))
print(b)
#[[1 0 0]
# [0 2 0]
# [0 0 3]]

  

  2.14 矩阵库Matrix函数

  matrices必须是二维的,但是numpy arrays(ndarrays可以是多维的),matrix最主要的优势就是类似于matlab中的格式很相似,不用方括号括起来看起来不那么方便。但是是一种矩阵格式的数据不是ndarrays数据的格式,同样也可以通过tolist进行转化

import numpy as np

a = np.mat('4 3;2 1')
print(a)
#[[4 3]
# [2 1]]
print(type(a))
#<class 'numpy.matrixlib.defmatrix.matrix'>
b = a.tolist()
print(b,type(b))
#[[4, 3], [2, 1]] <class 'list'>

  

  

Python笔记_第五篇_Python数据分析基础教程_NumPy基础的更多相关文章

  1. Python笔记_第五篇_Python数据分析基础教程_相关安装和版本查看

    1. IDE说明: 所有的案例用Anacoda中的Jupiter工具进行交互式讲解. 2. 版本和安装: NumPy从如下网站安装:http://sourceforge.net/projects/nu ...

  2. Python笔记_第五篇_Python数据分析基础教程_前言

    1. 前言: 本部分会讲解在Python环境下进行数值运算.以NumPy为核心,并讲解其他相关库的使用,诸如Matplotlib等绘图工具等. C.C++和Forttran等变成语言各有各的优势,但是 ...

  3. Python笔记_第五篇_Python数据分析基础教程_文件的读写

    1. 读写文件(基本) savetxt.loadtxt i2 = np.eye(2) print(i2) np.savetxt(r"C:\Users\Thomas\Desktop\eye.t ...

  4. Python笔记_第三篇_面向对象_4.单下划线和双下划线

    说道这里我们需要稍微暂停一下.前面我们说到了类是作为一个对象存放容器.这个容器里面有属性和方法.最好的理解类的方式就是把类想想成一个容器. 然后构造了一个析构函数和构造函数,然后又对object和se ...

  5. Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速

    Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...

  6. Python笔记_第四篇_高阶编程_实例化方法、静态方法、类方法和属性方法概念的解析。

    1.先叙述静态方法: 我们知道Python调用类的方法的时候都要进行一个实例化的处理.在面向对象中,一把存在静态类,静态方法,动态类.动态方法等乱七八糟的这么一些叫法.其实这些东西看起来抽象,但是很好 ...

  7. Python笔记_第三篇_面向对象_9.Python中的"get"和"set"方法(@property和@.setter)

    1. 限制访问的问题: 如果学过C# 语言的我们可以知道C# 语言有get和set方法.我们之前想要获取父类中的私有变量,只能通过写一个set和get的函数进行访问或者通过类生成的新关键字来访问私有属 ...

  8. Python笔记_第三篇_面向对象_2.构造函数和析构函数(含self说明)

    1. 构造函数: 为什么要有构造函数? 打一个比方:类的创建就是好比你创建了好了一种格式的房间,你租给上一个住户的后,里面会对方很多“垃圾”和不规则的物品摆放.构造函数就是下一个住户再使用的时候进行物 ...

  9. Python笔记_第三篇_面向对象_2.第一个Python类

    1. 设计一个类: 设计一个类主要从三个方面进行考虑: 第一:类名:类名要见名知意.首字母大写. 第二:属性. 第三:方法. 备注:在Python中有些东西并不是绝对化的事情,有些根据Python社区 ...

随机推荐

  1. Day5 - H - Supermarket POJ - 1456

    A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold ...

  2. 从零开始学C++(1 变量和基本类型)

    接下来的几篇文章介绍C++的基础知识点. C++是一种静态数据类型语言,它的类型检查发生在编译时.因此,编译器必须知道程序中每一个变量对应的数据类型. 数据类型是程序的基础:它告诉我们数据的意义以及我 ...

  3. php绕过open_basedir设置

    原理关于open_basedir    open_basedir是php.ini中的一个配置选项    它可将用户访问文件的活动范围限制在指定的区域,    假设open_basedir=/home/ ...

  4. wav文件与byte互转 C#

    //wav转byte public void WavToByte() { Byte[] bs; FileStream fs = new FileStream(@"C:\1.wav" ...

  5. Java For 循环

    章节 Java 基础 Java 简介 Java 环境搭建 Java 基本语法 Java 注释 Java 变量 Java 数据类型 Java 字符串 Java 类型转换 Java 运算符 Java 字符 ...

  6. PLC中双线圈问题

    以上重要 .所以一个线圈的状态在一个扫描周期 只能刷新一次.

  7. 微信小程序实现左滑删除效果(原生/uni-app)

    实现效果 列表中侧滑删除 删除不同时存在 scrollview上下滑动与侧滑删除不影响 uni-app实现 html部分 <template> <scroll-view :scrol ...

  8. Flask的请求钩子与上下文简览

    请求钩子(Hook) 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在请求开始时,建立数据库连接:在请求结束时,指定数据的交互格式.为了让>每个视图函数避免编写重复功能的代 ...

  9. Django 模板渲染

    模板语言 {{ 变量 }} {% 逻辑 %} {{ 变量 }} {{ 变量 }}中的点号 用于取出字典/列表等类型数据的值 {{ list.2 }} 获取列表list中索引为2的值 {{ dict.n ...

  10. 105-PHP使用var_dump查看类的类型

    <?php class ren{ //定义人类 } class mao{ //定义猫类 } $ren1=new ren(); //实例化人类 $mao1=new mao(); //实例化猫类 $ ...