初始Numpy

一、什么是Numpy?

简单来说,Numpy 是 Python 的一个科学计算包,包含了多维数组以及多维数组的操作。

Numpy 的核心是 ndarray 对象,这个对象封装了同质数据类型的n维数组。起名 ndarray 的原因就是因为是 n-dimension-array 的简写。

二、ndarray 与 python 原生 array 有什么区别

  • NumPy 数组在创建时有固定的大小,不同于Python列表(可以动态增长)。更改ndarray的大小将创建一个新的数组并删除原始数据。
  • NumPy 数组中的元素都需要具有相同的数据类型,因此在存储器中将具有相同的大小。数组的元素如果也是数组(可以是 Python 的原生 array,也可以是 ndarray)的情况下,则构成了多维数组。
  • NumPy 数组便于对大量数据进行高级数学和其他类型的操作。通常,这样的操作比使用Python的内置序列可能更有效和更少的代码执行。越来越多的科学和数学的基于Python的包使用NumPy数组,所以需要学会 Numpy 的使用。

三、Numpy 的矢量化(向量化)功能

如果想要将一个2-D数组 a 的每个元素与长度相同的另外一个数组 b 中相应位置的元素相乘,使用 Python 原生的数组实现如下:

for (i = 0; i < rows; i++): {
for (j = 0; j < columns; j++): {
c[i][j] = a[i][j]*b[i][j];
}}

使用 Numpy 实现的话,则可以直接使用矢量化功能:

c = a * b

矢量化代码有很多优点,其中包括:

  • 矢量化代码更简洁易读

  • 更少的代码行通常意味着更少的错误

  • 该代码更接近地类似于标准数学符号(使得更容易,通常,以正确地编码数学构造)

  • 矢量化导致更多的“Pythonic”代码。如果没有向量化,我们的代码将会效率很低,难以读取for循环。

N维数组 ndarray

Numpy 中最重要的一个对象就是 ndarray。
ndarray 结构图

ndarray中的每个元素在内存中使用相同大小的块。 ndarray中的每个元素是数据类型对象的对象(称为 dtype)。
从ndarray对象提取的任何元素(通过切片)由一个数组标量类型的 Python 对象表示。 下图显示了ndarray,数据类型对象(dtype)和数组标量类型之间的关系。

一、构建ndarray

import numpy as np
#一维数组
a = np.array([0,1,2,3])
a
Out[39]: array([0, 1, 2, 3])
#二维数组
b = np.array([[0,1,2],[4,5,6]])
b
Out[40]:
array([[0, 1, 2],
[4, 5, 6]])
#创建一个0-9的数组
a = np.arange(10)
a
Out[41]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#创建一个1-6,步长为2的数组
b = np.arange(1,6,2)
b
Out[42]: array([1, 3, 5])

二、常用的数组

# 全一矩阵
np.ones((3,3))
Out[43]:
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
# 零矩阵
np.zeros((2,2))
Out[44]:
array([[0., 0.],
[0., 0.]])
# 单位矩阵
np.eye(3)
Out[45]:
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
# 对角矩阵
np.diag(np.array([1,2,3,4]))
Out[46]:
array([[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 3, 0],
[0, 0, 0, 4]])

三、生成等差数列

linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None):
  • endpoint: 结束点如果现在为True,那么输入的第二个参数将会成为数列的最后一个元素,反之则不一定。
  • restep: 而retstep会改变计算的输出,输出一个元组,而元组的两个元素分别是需要生成的数列和数列的步进差值。
# 默认生成50个元素的等差序列,需设定起始值和终止值
np.linspace(1,10)
Out[47]:
array([ 1. , 1.18367347, 1.36734694, 1.55102041, 1.73469388,
1.91836735, 2.10204082, 2.28571429, 2.46938776, 2.65306122,
2.83673469, 3.02040816, 3.20408163, 3.3877551 , 3.57142857,
3.75510204, 3.93877551, 4.12244898, 4.30612245, 4.48979592,
4.67346939, 4.85714286, 5.04081633, 5.2244898 , 5.40816327,
5.59183673, 5.7755102 , 5.95918367, 6.14285714, 6.32653061,
6.51020408, 6.69387755, 6.87755102, 7.06122449, 7.24489796,
7.42857143, 7.6122449 , 7.79591837, 7.97959184, 8.16326531,
8.34693878, 8.53061224, 8.71428571, 8.89795918, 9.08163265,
9.26530612, 9.44897959, 9.63265306, 9.81632653, 10. ])
# 生成指定个数的等差序列
np.linspace(1,10,10)
Out[48]: array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])

四、生成等比数列

logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
  • base:等比基数 默认为10
# 创建10个1-1的等比数列, 因为默认基数是10
np.logspace(0, 0, 10)
Out[55]: array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
# 创建10个1-2的10次方之间的等比数列, 改变等比基数
np.logspace(0, 9, 10, base=2)
Out[59]: array([ 1., 2., 4., 8., 16., 32., 64., 128., 256., 512.])
# 创建10个1-2的10次方之间的等比数列, 改变等比基数
np.logspace(0, 9, 10, base=2, dtype=int)
Out[60]: array([ 1, 2, 4, 8, 16, 32, 64, 128, 256, 512])

五、生成meshgrid网格矩阵

meshgrid函数通常在数据的矢量化上使用,但是使用的方法我暂时还不是很明确。而meshgrid的作用适用于生成网格型数据,可以接受两个一维数组生成两个二维矩阵,对应两个数组中所有的(x,y)对。接下来通过简单的shell交互来演示一下这个功能的使用,并做一下小结。

meshgrid(*xi, **kwargs)

功能:从一个坐标向量中返回一个坐标矩阵

参数:

x1,x2...,xn:数组,一维的数组代表网格的坐标。

indexing:{'xy','ij'},笛卡尔坐标'xy'或矩阵'ij'下标作为输出,默认的是笛卡尔坐标。

sparse:bool类型,如果为True,返回一个稀疏矩阵保存在内存中,默认是False。

copy:bool类型,如果是False,返回一个原始数组的视图保存在内存中,默认是True。如果,sparse和copy都为False,将有可能返回一个不连续的数组。而且,如果广播数组的元素超过一个,可以使用一个独立的内存。如果想要对这个数组进行写操作,请先拷贝这个数组。

返回值:x1,x2,....,xn:ndarray(numpy数组)

参数

例子

x = np.linspace(1, 3, 3)
x
Out[69]: array([1., 2., 3.])
y = np.linspace(4, 7, 4)
y
Out[71]: array([4., 5., 6., 7.])
xv, yv = np.meshgrid(x, y)
xv
Out[73]:
array([[1., 2., 3.],
[1., 2., 3.],
[1., 2., 3.],
[1., 2., 3.]])
yv
Out[74]:
array([[4., 4., 4.],
[5., 5., 5.],
[6., 6., 6.],
[7., 7., 7.]])

通过上面的例子,其实可以发现meshgrid函数将两个输入的数组x和y进行扩展,前一个的扩展与后一个有关,后一个的扩展与前一个有关,前一个是竖向扩展,后一个是横向扩展。因为,y的大小为4,所以x竖向扩展为原来的四倍,而x的大小为3,所以y横向扩展为原来的3倍。通过meshgrid函数之后,输入由原来的数组变成了一个矩阵。通过使用meshgrid函数,可以产生一个表格矩阵,下面用一个例子来展示产生一个2*2网格的坐标,每个网格的大小为1。

# 生成一个2*2的网格的坐标
#从0开始到1结束,返回一个numpy数组,nx代表数组中元素的个数
x = np.linspace(0,2,3)
x
Out[77]: array([0., 1., 2.])
y = np.linspace(0,2,3)
y
Out[79]: array([0., 1., 2.])
xv,yv = np.meshgrid(x,y)
print(xv.ravel())
print(yv.ravel())
[0. 1. 2. 0. 1. 2. 0. 1. 2.]
[0. 0. 0. 1. 1. 1. 2. 2. 2.]

 ravel函数是将矩阵变为一个一维的数组,其中xv.ravel()就表示x轴的坐标,yv.ravel()就表示了y轴的坐标,我们将x轴的坐标和y轴的坐标进行一一对应,就产生了一个2*2大小为1的网格中的9个点的坐标。

如果,将sparse参数设置为True,就不会向上面一样进行扩展了,也就是说它产生的网格坐标不是所有的网格坐标,而是网格对角线上的坐标点。

nx,ny = (3,3)
#从0开始到1结束,返回一个numpy数组,nx代表数组中元素的个数
x = np.linspace(0,2,nx)
# [0. 1. 2.]
y = np.linspace(0,2,ny)
# [0. 1. 2.]
xv,yv = np.meshgrid(x,y,sparse=True)
print(xv)
[[0. 1. 2.]]

六、创建行列向量

np.r_[0:50:5]
Out[84]: array([ 0, 5, 10, 15, 20, 25, 30, 35, 40, 45])
np.c_[0:50:5]
Out[85]:
array([[ 0],
[ 5],
[10],
[15],
[20],
[25],
[30],
[35],
[40],
[45]])

 七、生成随机数组

  • np.random.seed(1234) #设置随机种子为1234
  • np.random.rand(2,3) #2行3列均匀分布
  • np.random.randn(2,3) #Gaussian
  • np.random.randn(3,3) #三行三列正态分布随机数据
  • np.random.randint(1,3,5) #min max size 产生min-max中size个整数
  • np.random.randint(1,100,[5,5]) #(1,100)以内的5行5列随机整数
  • np.random.random(10) #(0,1)以内10个随机浮点数
  • np.random.sample(10) #产生0,1内10个随机数
  • np.random.choice(10) #[0,10)内随机选择一个数
np.random.rand(2,3) #2行3列均匀分布
Out[86]:
array([[0.10437154, 0.25867737, 0.60777109],
[0.21729078, 0.38925987, 0.69986437]])
np.random.randn(2,3) #Gaussian
Out[87]:
array([[ 0.18813823, 0.21829928, 1.30977936],
[-0.80801174, -0.2710817 , 0.30614839]])
np.random.randn(3,3) #三行三列正态分布随机数据
Out[88]:
array([[ 0.31102522, 0.24991538, -0.74242789],
[-0.92471694, 0.09958997, -0.03147058],
[-0.31209779, 0.94883746, -0.71359588]])
np.random.randint(1,3,5) #min max size 产生min-max中size个整数
Out[89]: array([1, 2, 2, 1, 1])
np.random.randint(1,100,[5,5]) #(1,100)以内的5行5列随机整数
Out[90]:
array([[71, 80, 19, 13, 56],
[40, 51, 42, 10, 65],
[14, 87, 91, 36, 29],
[27, 43, 24, 19, 31],
[89, 79, 97, 21, 24]])
np.random.random(10) #(0,1)以内10个随机浮点数
Out[91]:
array([0.31589784, 0.04031992, 0.57425601, 0.57655811, 0.36513947,
0.19312436, 0.22195245, 0.94515895, 0.85251243, 0.06609203])
np.random.sample(10) #产生0,1内10个随机数
Out[92]:
array([0.47695889, 0.75269019, 0.31765674, 0.53586716, 0.94818987,
0.50960077, 0.32388153, 0.43584506, 0.00900502, 0.03402676])
np.random.choice(10) #[0,10)内随机选择一个数
Out[93]: 2

八、nddaray常用属性

ndarray.flags 有关数组的内存布局的信息。
ndarray.shape 数组维数组。
ndarray.strides 遍历数组时,在每个维度中步进的字节数组。
ndarray.ndim 数组维数,在Python世界中,维度的数量被称为rank
ndarray.data Python缓冲区对象指向数组的数据的开始。
ndarray.size 数组中的元素总个数。
ndarray.itemsize 一个数组元素的长度(以字节为单位)。
ndarray.nbytes 数组的元素消耗的总字节数。
ndarray.base 如果内存是来自某个其他对象的基本对象。
ndarray.dtype 数组元素的数据类型。
ndarray.T 数组的转置。
a = np.array([(1,2,3),(4,5,6)])
a
Out[95]:
array([[1, 2, 3],
[4, 5, 6]])
a.flags
Out[96]:
C_CONTIGUOUS : True
F_CONTIGUOUS : False
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
a.shape
Out[97]: (2, 3)
a.ndim
Out[98]: 2
a.strides
Out[99]: (12, 4)
a.data
Out[100]: <memory at 0x0000004E715C8B40>
a.size
Out[101]: 6
a.itemsize
Out[102]: 4
a.nbytes
Out[103]: 24
a.base
a.dtype
Out[105]: dtype('int32')
a.T
Out[106]:
array([[1, 4],
[2, 5],
[3, 6]])

  

Numpy系列(一)- array的更多相关文章

  1. Numpy系列(十二)- 矩阵运算

    numpy模块中的矩阵对象为numpy.matrix,包括矩阵数据的处理,矩阵的计算,以及基本的统计功能,转置,可逆性等等,包括对复数的处理,均在matrix对象中. class numpy.matr ...

  2. numpy创建的array

    import numpy as np array = np.array([[1,2,3], [2,3,4]]) #打印列表 print(array)#是几维的 print('number of dim ...

  3. numpy入门—Numpy的核心array对象以及创建array的方法

    Numpy的核心array对象以及创建array的方法 array对象的背景: Numpy的核心数据结构,就叫做array就是数组,array对象可以是一维数组,也可以是多维数组: Python的Li ...

  4. Numpy 系列(十一)- genfromtxt函数

    定义输入 genfromtxt的唯一强制参数是数据的源.它可以是字符串,字符串列表或生成器.如果提供了单个字符串,则假定它是本地或远程文件或具有read方法的打开的类文件对象的名称,例如文件或Stri ...

  5. Numpy系列(二)- 数据类型

    Numpy 中的数组比 Python 原生中的数组(只支持整数类型与浮点类型)强大的一点就是它支持更多的数据类型. 基本数据类型 numpy常见的数据类型 数据类型 描述 bool_ 布尔(True或 ...

  6. Numpy系列(三)- 基本运算操作

    Numpy 中数组上的算术运算符使用元素级别.最后的结果使用新的一个数组来返回. import numpy as np a = np.array( [20,30,40,50] ) b = np.ara ...

  7. Numpy系列(四)- 索引和切片

    Python 中原生的数组就支持使用方括号([])进行索引和切片操作,Numpy 自然不会放过这个强大的特性.  单个元素索引 1-D数组的单元素索引是人们期望的.它的工作原理与其他标准Python序 ...

  8. Numpy系列(五)- 复制和视图

    当计算和操作数组时,它们的数据有时被复制到新的数组中,有时不复制.这里我们做个区分. 完全不复制 简单赋值不会创建数组对象或其数据的拷贝. import numpy as np a = np.aran ...

  9. Numpy系列(六)- 形状操作

    Numpy 有一个强大之处在于可以很方便的修改生成的N维数组的形状. 更改数组形状 数组具有由沿着每个轴的元素数量给出的形状: a = np.floor(10*np.random.random((3, ...

随机推荐

  1. Expression

    表达式目录树 1.什么是表达式目录树Expression? 表达式目录树是一个数据结构,语法树. 首先我们去看看 Expressions类 ,定义了一个泛型委托类型 TDelegate: // 摘要: ...

  2. 英语词性系列-B02-动词

    诗Poem 要求:背诵这首诗,翻译现代文,根据现代文用简单的英文翻译. 动词直观体会 动词 动词 动词 动词 动词 sell卖 buy买 beat击打 look看 dance跳舞 sing唱歌 spe ...

  3. 【Python 18】BMR计算器2.0(数值类型转换与while循环)

    1.案例描述 基础代谢率(BMR):我们安静状态下(通常为静卧状态)消耗的最低热量,人的其他活动都建立在这个基础上. 计算公式: BMR(男) = (13.7*体重kg)+(5.0*身高cm)-(6. ...

  4. Redis学习笔记(5)——Redis数据持久化

    出处http://www.cnblogs.com/xiaoxi/p/7065328.html 一.概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存 ...

  5. Python编码规范(PEP8)及奇技淫巧(不断更新)

    https://blog.csdn.net/MrLevo520/article/details/69155636

  6. 《JAVA程序设计》_第五周学习总结

    一.本周学习内容 1.接口--6.1知识 接口的声明 interface 接口名 接口体 只有常量和抽象方法 (用final.static.public修饰的变量,关键词可省略) (用abstract ...

  7. Push rejected: Push to origin/master was rejected错误解决方案

    解决方案如下: 1.切换到自己项目所在的目录,右键选择GIT BASH Here,Idea中可使用Alt+F12 2.在terminl窗口中依次输入命令: git pull git pull orig ...

  8. Linux:Day12(上) 进程

    内核的功用:进程管理.文件系统.网络功能.内存管理.驱动程序.安全功能 Process:运行中的程序的一个副本. 存在生命周期 Linux内核存储进程信息的固定格式 :task struct 多个任务 ...

  9. c++面经积累<2>

    4.类成员初始化方式:列表初始化和赋值初始化 赋值初始化通过在函数体内进行赋值,列表初始化,在构造函数后面加上冒号,使用初始化列表进行初始化.在函数体内进行初始化,是在所有的数据成员被分配内存空间后进 ...

  10. ORM杂记

    1.反射练习 import sys class Person(object): def __init__(self, name): self.name = name def eat(self, foo ...