Python笔记_第五篇_Python数据分析基础教程_NumPy基础

时间:2022-12-27 22:09:49

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笔记&lowbar;第五篇&lowbar;Python数据分析基础教程&lowbar;相关安装和版本查看

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

  2. Python笔记&lowbar;第五篇&lowbar;Python数据分析基础教程&lowbar;前言

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

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

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

  4. Python笔记&lowbar;第三篇&lowbar;面向对象&lowbar;4&period;单下划线和双下划线

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

  5. Python笔记&lowbar;第四篇&lowbar;高阶编程&lowbar;进程、线程、协程&lowbar;5&period;GPU加速

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

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

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

  7. Python笔记&lowbar;第三篇&lowbar;面向对象&lowbar;9&period;Python中的&quot&semi;get&quot&semi;和&quot&semi;set&quot&semi;方法&lpar;&commat;property和&commat;&period;setter&rpar;

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

  8. Python笔记&lowbar;第三篇&lowbar;面向对象&lowbar;2&period;构造函数和析构函数&lpar;含self说明&rpar;

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

  9. Python笔记&lowbar;第三篇&lowbar;面向对象&lowbar;2&period;第一个Python类

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

随机推荐

  1. 设置CentOS不启用图形界面

    由于linux服务器放在机房长时间运行,或者只是在后台运行,一般通过secureCRT连接服务器: 所以在虚拟机上都不需要图形界面,而且图形界面占用内存. 所以,我们可以通过简单的设置,让linux只 ...

  2. Java&colon;集合工具类-Collections

    Java.util.Collections 集合框架工具类Collections,其方法都是静态的,本身没有构造函数. 常见方法: static <T extends Comparable&lt ...

  3. &lbrack;知识库分享系列&rsqb; 四、ASP&period;NET MVC and Winform

    知识库分享系列: [知识库分享系列] 三.Web(高性能Web站点建设) [知识库分享系列] 二..NET(ASP.NET) [知识库分享系列] 一.开篇 分享介绍本篇分享两个知识库节点,分别为“AS ...

  4. N皇后回溯解法 leetcode N-Queens

    class Solution { public: vector<vector<string> > solveNQueens(int n) { vector<vector& ...

  5. 2013年全球ERP市场格局(Gartner)

    Gartner于5月5日公布了全球ERP市场的分析报告,报告称全球ERP软件销售额2013年整体增长了3.8%(从2012年$244亿美元到2013年$258亿美元),全球前五位ERP厂商座次例如以下 ...

  6. Java中使用long类型实现精确的四则运算

    引子 Effective Java 2nd Edition 第48条建议:如果需要精确的答案,请避免使用float和doble.float和double类型主要是为了科学计算和工程计算而设计的.他们执 ...

  7. C&num; 高级编程05----常用修饰符

    常用修饰符: 1.访问可见性修饰符 修饰符 应用于 说明 public 类型或成员 任何代码都可访问 protected 类型或内嵌类型的成员 只有子类能访问 internal 类型或成员 只能在包含 ...

  8. 转:我是否该放弃VB&period;Net&quest;

    我是否该放弃VB.Net呢?这个问题一次次的出现在我的脑海里,而且这种想法越来越强烈.放弃VB.Net至少能让我的生活变得轻松些.如果你是个C#程序员,那拷贝粘贴代码会很容易,因为可以找到的例子代码如 ...

  9. PHP curl登录 跳过验证码

    <?php switch($_GET['do']){ case 'vc': $cookieFile = "./test.tmp"; $url = 'http://localh ...

  10. Docs命令大全 备用

    #1 一: net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" ...