numpy介绍
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色,并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。
numpy安装
Microsoft Windows [版本 10.0.19043.1645]
(c) Microsoft Corporation。保留所有权利。
C:\WINDOWS\system32>pip install numpy
Requirement already satisfied: numpy in c:\users\1234\anaconda3\lib\site-packages (1.20.3)
NumPy Ndarray 对象
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。 ndarray 对象是用于存放同类型元素的多维数组。 ndarray 中的每个元素在内存中都有相同存储大小的区域。
创建数组对象
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
名称: 描述
object 数组或嵌套的数列
dtype 数组元素的数据类型,可选
copy 对象是否需要复制,可选
order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok 默认返回一个与基类类型一致的数组
ndmin 指定生成数组的最小维度
import numpy as np
a = np.array([1,2,3])
print (a)
定义一维数组
from numpy import *
import numpy as np
b=np.array([1,2,3])
print(b)
print(b.dtype)
print(b.shape)
定义二维数组
from numpy import *
import numpy as np
c=np.array([['a','b','c']])
print(c)
print(c.shape)
定义最小维度
from numpy import *
import numpy as np
d=np.array([1,2,3],ndmin=2)
print(d)
numpy数据类型
名称 | 描述 |
bool_ | 布尔型数据类型(True 或者 False) |
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
int8 | 字节(-128 to 127) |
int16 | 整数(-32768 to 32767) |
int32 | 整数(-2147483648 to 2147483647) |
int64 | 整数(-9223372036854775808 to 9223372036854775807) |
uint8 | 无符号整数(0 to 255) |
uint16 | 无符号整数(0 to 65535) |
uint32 | 无符号整数(0 to 4294967295) |
uint64 | 无符号整数(0 to 18446744073709551615) |
float_ | float64 类型的简写 |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ | complex128 类型的简写,即 128 位复数 |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
数据类型对象 (dtype)
数据类型对象(numpy.dtype 类的实例)用来描述与数组对应的内存区域是如何使用,它描述了数据的以下几个方面:
数据的类型(整数,浮点数或者 Python 对象) 数据的大小(例如, 整数使用多少个字节存储) 数据的字节顺序(小端法或大端法) 在结构化类型的情况下,字段的名称、每个字段的数据类型和每个字段所取的内存块的部分 如果数据类型是子数组,那么它的形状和数据类型是什么。
字节顺序是通过对数据类型预先设定 < 或 > 来决定的。
< 意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。>
意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)
指定数据类型
from numpy import *
import numpy as np
e=np.array([1,2,3],dtype=float32)
print(e)
定义数据数据类型对象
from numpy import *
import numpy as np
dt=np.dtype(np.int32)
dt=np.dtype('f4')
用户定义数组
from numpy import *
import numpy as np
a=np.array([1,2,3],dtype=dt)
print(a)
定义数据类型
from numpy import *
import numpy as np
#int8,int16,int32,int64可以使用字符串代替'i1','i2','i4','i8'
#字符串以使用字符串代替'S30'
#浮点型以使用字符串代替'f4'
#定义数据类型
st=np.dtype([('name','S30'),('age','i1'),('marks','f4')])
b=np.array([('abc',21,50),('zxc',18,81),('yyy',25,90)],dtype=st)
print(b)
print(len(b))
numpy创建数组
特殊方式创建数组
-
创建空数组
from numpy import * import numpy as np n=np.empty([3,3],dtype=np.float32,order='C') print(n)
-
创建零数组
from numpy import * import numpy as np z=np.zeros([2,2],dtype='i4',order='C') print(z)
-
创建原组数组
from numpy import * import numpy as np x=np.zeros([2,2],dtype=[('x','i1'),('y','i4')]) print(x) print(len(x))
-
创建一维数组
from numpy import * import numpy as np c=np.ones([3,3],dtype='f4') print(c)
从已有数据创建数组
-
元组转数组
from numpy import * import numpy as np t=(3,4,5) at=np.asarray(y) print(at)
-
将元组列表转为数组
from numpy import * import numpy as np lt=[(1,2,3),(4,5)] alt=np.asarray(lt,dtype=object) print(alt)
从数组范围创建数组
-
访问创建数组
from numpy import * import numpy as np aa=np.arange(10,20,2,dtype=float) print(aa))
数组操作
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。 ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。
切片与索引
-
通过切片获取数据
from numpy import * import numpy as np a=np.arange(20) print(a)
-
定义切片
from numpy import * import numpy as np a=np.arange(20) b=slice(3,9,2) print(a[b])
-
通过索引获取值
from numpy import * import numpy as np a=np.arange(20) print(a)
-
按一维数组指定
from numpy import * import numpy as np a=np.array([[1,2,3],[4,5,6],[7,8,9]]) print(a[1:])
-
按二维数组指定
from numpy import * import numpy as np a=np.array([[1,2,3],[4,5,6],[7,8,9]]) print(a[1:,1:]) print(a[...,1:]) print(a[1,1]) print("*"*100) print(a[1:3,0:2]) print(a[1:3,0:4:2]) print(a[0:4,2:3])
数组广播=运算
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。
如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。
-
一维对一维
from numpy import * import numpy as np a=np.array([1,2,3,4]) b=np.array([10,20,30,40]) c=a*b print(c)
-
二维对二维
from numpy import * import numpy as np a=np.array([[0,0,0], [10,10,10], [20,20,20], [30,30,30]]) b=np.array([[1,2,3]]) bb=np.tile(b,(4,1))#重复b的各个维度 print(bb) print(a+bb)
-
二维对一维
from numpy import * import numpy as np a=np.array([[0,0,0], [10,10,10], [20,20,20], [30,30,30]]) b=np.array([[1,2,3]]) print(b)
数组迭代
NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。
迭代器最基本的任务的可以完成对数组元素的访问。
-
变形
from numpy import * import numpy as np a=np.arange(8) print(a.reshape(2,4))
- 迭代
from numpy import * import numpy as np a=np.arange(9).reshape(3,3)
-
不迭代,遍历
from numpy import * import numpy as np a=np.arange(8) for i in a: print(i)
-
迭代
from numpy import * import numpy as np a=np.arange(8) for i in a.flat: print(i)
-
迭代器
from numpy import * import numpy as np a=np.arange(8) for i in np.nditer(a): print(i)
数组操作
-
拷贝数据,不影响原始数据
from numpy import * import numpy as np a=np.arange(8).reshape(2,4) print(a) print(a.flatten(order="C")) print("*"*100)
-
展平数组元素
from numpy import * import numpy as np a=np.arange(4).reshape(2,2) print(a.ravel(order="C")) print("*"*100)
-
展平数组元素
from numpy import * import numpy as np a=np.arange(8).reshape(4,2) print(a) print(np.transpose(a)) print("*"*100,"对换数组维度")
-
扩展
from numpy import * import numpy as np a=np.arange(4).reshape(1,4) b=np.broadcast_to(a,(4,4)) print(b) print("*"*100)
-
连接数组
from numpy import * import numpy as np a=np.array([[1,2],[3,4]]) b=np.array([[1,2],[3,4]]) print(np.concatenate((a,b),0)) print("*"*100)
-
分割数组
from numpy import * import numpy as np a=np.arange(9) b=np.split(a,3) print(b) print("*"*100)
-
添加
from numpy import * import numpy as np a=np.array([[1,2,3],[4,5,6]]) b=np.append(a,[7,8,9]) print(b.reshape(3,3)) print("*"*100)
-
删除
from numpy import * import numpy as np a=np.arange(12).reshape(3,4) b=np.delete(a,5) print(b) b=np.delete(a,1,axis=1); print(b)
函数
函数 | 描述 |
add() | 对两个数组的逐个字符串元素进行连接 |
multiply() | 返回按元素多重连接后的字符串 |
center() | 居中字符串 |
capitalize() | 将字符串第一个字母转换为大写 |
title() | 将字符串的每个单词的第一个字母转换为大写 |
lower() | 数组元素转换为小写 |
upper() | 数组元素转换为大写 |
split() | 指定分隔符对字符串进行分割,并返回数组列表 |
splitlines() | 返回元素中的行列表,以换行符分割 |
strip() | 移除元素开头或者结尾处的特定字符 |
join() | 通过指定分隔符来连接数组中的元素 |
replace() | 使用新字符串替换字符串中的所有子字符串 |
decode() | 数组元素依次调用str.decode |
encode() | 数组元素依次调用str.encode |
字符串函数
-
字符串链接
from numpy import * import numpy as np print(np.char.add(["hello"],["xyz"])) print() print(np.char.add(["hello","123"],["xyz","456"])) print()
-
多重连接
from numpy import * import numpy as np print(np.char.multiply("abc",3)) print()
-
字符串居中
from numpy import * import numpy as np #(字符串,长度,填充字符) print(np.char.center("by",20,fillchar="*")) print()
-
首字母大写
from numpy import * import numpy as np print(np.char.capitalize("abc")) print()
-
每个单词首字母大写
from numpy import * import numpy as np print(np.char.title("abc def")) print()
-
每个元素转小写
from numpy import * import numpy as np print(np.char.lower(['ABC','DEF'])) print()
-
每个元素转大写
from numpy import * import numpy as np print(np.char.upper(['aBC','dEF'])) print()
-
指定字符进行分割,返回数组
from numpy import * import numpy as np print(np.char.split("i like run?")) print(np.char.split("wwww.baidu.com",sep='.')) print()
-
换行符分割字符串,返回数组
from numpy import * import numpy as np print(np.char.splitlines("i\nlike\nrun?")) print()
-
移除开头或者结尾指定字符
from numpy import * import numpy as np print(np.char.strip("1abc1111def1","1")) print(np.char.strip(['aeee','awwww'],'a')) print()
-
连接插入指定字符
from numpy import * import numpy as np print(np.char.join([":","_"],["abcd","123"]))
-
替换字符串所有字符串
from numpy import * import numpy as np print(np.char.replace("i like runoob ","oo","cc"))
-
对字符串进行编码
from numpy import * import numpy as np #默认编码utf-8 a=np.char.encode("abc","cp500") print(a)
-
编码进行解码
from numpy import * import numpy as np a=np.char.encode("abc","cp500") print(np.char.decode(a,"cp500")) print()
数学函数
-
返回最大整数,即向下取整
from numpy import * import numpy as np a=np.array([-1.4,1.5,11,33]) print(np.floor(a)) print()
-
返回最小整数,即向上取整
from numpy import * import numpy as np a=np.array([-1.4,1.5,11,33]) print(np.floor(a)) print()
-
NumPy 算术函数
from numpy import * import numpy as np a = np.arange(9, dtype = np.float_).reshape(3,3) print ('第一个数组:') print (a) print ('\n') print ('第二个数组:') b = np.array([10,10,10]) print (b) print ('\n') print ('两个数组相加:') print (np.add(a,b)) print ('\n') print ('两个数组相减:') print (np.subtract(a,b)) print ('\n') print ('两个数组相乘:') print (np.multiply(a,b)) print ('\n') print ('两个数组相除:') print (np.divide(a,b))
统计函数
-
NumPy 统计函数
from numpy import * import numpy as np a = np.array([[3,7,5],[8,4,3],[2,4,9]]) print ('我们的数组是:') print (a) print ('\n') print ('调用 amin() 函数:') print (np.amin(a,1)) print ('\n') print ('再次调用 amin() 函数:') print (np.amin(a,0)) print ('\n') print ('调用 amax() 函数:') print (np.amax(a)) print ('\n') print ('再次调用 amax() 函数:') print (np.amax(a, axis = 0))
-
函数计算数组中元素最大值与最小值的差(最大值 - 最小值)。
from numpy import * import numpy as np a = np.array([[3,7,5],[8,4,3],[2,4,9]]) print ('我们的数组是:') print (a) print ('\n') print ('调用 ptp() 函数:') print (np.ptp(a)) print ('\n') print ('沿轴 1 调用 ptp() 函数:') print (np.ptp(a, axis = 1)) print ('\n') print ('沿轴 0 调用 ptp() 函数:') print (np.ptp(a, axis = 0))
-
函数返回输入数组的排序副本。函数格式如下:
from numpy import * import numpy as np a = np.array([[3,7],[9,1]]) print ('我们的数组是:') print (a) print ('\n') print ('调用 sort() 函数:') print (np.sort(a)) print ('\n') print ('按列排序:') print (np.sort(a, axis = 0)) print ('\n')
排序函数
-
在 sort 函数中排序字段
from numpy import * import numpy as np dt = np.dtype([('name', 'S10'),('age', int)]) a = np.array([("raju",21),("anil",25),("ravi", 17), ("amar",27)], dtype = dt) print ('我们的数组是:') print (a) print ('\n') print ('按 name 排序:') print (np.sort(a, order = 'name'))
-
函数返回的是数组值从小到大的索引值。
from numpy import * import numpy as np x = np.array([3, 1, 2]) print ('我们的数组是:') print (x) print ('\n') print ('对 x 调用 argsort() 函数:') y = np.argsort(x) print (y) print ('\n') print ('以排序后的顺序重构原数组:') print (x[y]) print ('\n') print ('使用循环重构原数组:') for i in y: print (x[i], end=" ")