@[TOC]Numpy学习总结
1.Numpy简介
Numpy用于处理数组的python库。支持高级大量的维度数组与矩阵运算。数组是指把具有相同类型的若干元素按无序的形式组织起来的一种形式。
2.Numpy导入
使用import导入,使用别名np,即import numpy as np
import numpy as np
arr = np.array([1,2,3,4,5,6])
arr
array([1, 2, 3, 4, 5, 6])
3.数组创建
Numpy的对象主要是齐次多维数组,是一个元素表。元素类型相同,Numpy的维度成为轴axis,度量为秩rank。
#创建数组
import numpy as np
arr =np.array([1,2,3,4,5,6])
arr
array([1, 2, 3, 4, 5, 6])
数组的维数
维数是指数组深度(嵌套数组)的级别
0-D数组
指一个元素,此时没有嵌套
import numpy as np
arr = np.array(61)
arr
array(61)
1-D数组
成为一维数组,相当于列表
import numpy as np
arr = np.array([1,2,3,4,5,6])
arr
array([1,2,,3,4,5,6])
2-D数组
元素为1-D数组的数组,元素是一维数组
import numpy as np
arr = np.array([[1,2,3,],[4,5,6]])#注意:两个一维数组外面要再有一个中括号
arr
3-D数组
元素为2-D数组的数组
import numpy as np
arr = np.array([[[1,2,3],[4,5,6],[7,8,9]]])
arr
array([[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]])
利用函数创建数组
np.arange()
np.ones()
np.zeros()
np.random.randint()
np.arange(1,10,1,dtype=float) #arange函数创建
array([1., 2., 3., 4., 5., 6., 7., 8., 9.])
np.ones((3,3,4),dtype=int) #创建2页3行4列的数据
array([[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]],
[[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]]])
np.zeros((2,3,4)) #创建2页3行4列的零矩阵
array([[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]],
[[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]]])
np.linspace(-1,2,5) #起点为-1,终点为2,取5个数
array([-1. , -0.25, 0.5 , 1.25, 2. ])
np.random.randint(-9,3,(2,3)) #生成两行三列,大小为[-9,3)之间(左闭右开)的随机整数
array([[-8, 0, -9],
[-7, -9, 1]])
4.数组维数
创建数组时,使用ndmin参数定义维数
例:创建一个5个维度的数组,并验证
import numpy as np
arr = np.array([1,2,3,4],ndmin=5)
print(arr)
[[[[[1 2 3 4]]]]]
也可以通过ndmin进行查询
import numpy as np
a = np.array(42)
b = np.array([1,2,3,4,5])
c = np.array([[1,2,3],[4,5,6]])
d = np.array([[[1,2,3],[4,5,6],[7,8,9]]])
print(a.ndim)
print(b.ndim)
print(c.ndim)
print(d.ndim)
0
1
2
3
5.数组索引
通过索引从0开始,-1代表最后一个索引,包头不包尾,使用中括号
#访问1-D数组
import numpy as np
arr = np.array([1,2,3,4])
arr[0]
1
访问2-D数组,例[0,1],前面代表元素维数,后面代表索引号
#访问第一维中的第二个元素:
import numpy as np
arr = np.array([[1,2,3,4,5],[6,7,8,9,10]])
arr[0,1]
2
#访问第一维中的第五个元素:
import numpy as np
arr = np.array([[1,2,3,4,5],[6,7,8,9,10]])
arr[0,4]
5
访问3-D数组,例[0,2,3]第一个数字代表3-D数组的维数,第二个是2-D元素的维数,第三个数字代表索引号
#访问第一个数组的第二个数组的第三个元素:
import numpy as np
arr = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr[0,1,2]
6
使用负索引,从尾部开始访问
#打印第二个维中的最后一个元素
import numpy as np
arr = np.array([[1,2,3,4,5,],[6,7,8,9,10]])
arr[1,-1]
10
6.数组裁切
裁切是指从一个给定的索引到另一个给定的索引,[start:end],依旧是包头不包尾,还可以加上步长[start: end:step]。
若不传递start,将视为0,不传递end,将视为该维度内数组的长度,不传递step,将视为1。
#裁切下列数组索1引到索引5的元素
import numpy as np
arr = np.array([1,2,3,4,5,6,7])
arr[1:5]
array([2, 3, 4, 5])
#裁切数组中索引4到结尾的元素:
import numpy as np
arr = np.array([1,2,3,4,5,6,7])
arr[4:]
array([5, 6, 7])
#从索引1到索引5,返回相隔的元素
import numpy as np
arr=np.array([1,2,3,4,5,6,7])
arr[1:5:2]
array([2,4])
裁切2-D数组
#从第二个元素开始,对索引1到索引4(不包括4)的元素进行切片
import numpy as np
arr = np.array([[1,2,3,4,5,],[6,7,8,9,10]])
arr[1,1:4]
array([7, 8, 9])
#从两个元素返回索引2:
import numpy as np
arr = np.array([[1,2,3,4,5],[6,7,8,9,10]])
arr[0:2,2]
array([3, 8])
7.Numpy数据类型
| i-整数 | b-布尔 | u-无符号整数
|f-浮点| c-复合浮点数| m-timedelta
| M-detetime | O-对象 |S-字符串
| U-Unicode字符串 | V-固定的其他类型的内存块(void)|
查询数组的数据类型,dtype
import numpy as np
arr = np.array([1,2,3,4])
arr.dtype
dtype('int32')
用已定义的数据类型创建数组,直接在后面用dtype定义要转换的数据类型
import numpy as np
arr = np.array([1, 2, 3, 4], dtype='S')
print(arr)
print(arr.dtype)
[b'1' b'2' b'3' b'4']
|S1
转换已有的数组类型,astype()
#通过使用‘i’作为参数值,将数据类型从浮点数更改为整数
import numpy as np
arr = np.array([1.1,2.1,3.1])
newarr = arr.astype('i')
newarr
array([1, 2, 3], dtype=int32)
8.数组副本和视图
区别:副本是一个新的数组,视图是原始数据的视图
副本拥有数据,对副本的任何更改都不会影响到原始数据,对原始数据进行更改也不会影响到副本
视图没有数据,对视图进行更改会影响原始数据,更改原始数据会影响视图
副本产生,直接进行复制copy()
import numpy as np
arr = np.array([1,2,3,4,5])
x = arr.copy() #副本产生
arr[0] = 61 #更改原始数据中索引0的数字为61
print(x) #此时x为array([1,2,3,4,5]),副本不会变
print(arr)
[1 2 3 4 5]
[61 2 3 4 5]
视图创建,view()
import numpy as np
arr = np.array([1,2,3,4,5])
x = arr.view()
arr[0]=61 #更改原始数据中索引0的数字为61
print(x) #此时x为array([61,2,3,4,5]),视图改变
print(arr)
[61 2 3 4 5]
[61 2 3 4 5]
import numpy as np
arr = np.array([1,2,3,4,5])
x = arr.view()
x[0]=21 #视图改变会影响原始数据改变
print(arr)
print(x)
[21 2 3 4 5]
[21 2 3 4 5]
检查副本和视图是否拥有数据
每一个numpy数组都有一个属性base,若数组有数据则返回None,没有数据将返回原始对象
import numpy as np
arr = np.array([1,2,3,4,5])
x = arr.copy()
y = arr.view()
print(x.base)
print(y.base)
None
[1 2 3 4 5]
9.数组形状
数组形状是每个维中元素的数量,使用shape
#打印2-D数组的形状
import numpy as np
arr = np.array([[1,2,3,4],[5,6,7,8]])
print(arr.shape) #最后结果为索引个数和每个索引的元素个数
#下面结果为该数组有两个维,每个维有4个元素
(2, 4)
#利用ndmin使用1,2,3,4的向量创建5个维度的数组,并验证最后一个维度的值为4
import numpy as np
arr = np.array([1,2,3,4],ndmin=5)
print(arr)
print('shape of array:',arr.shape)
[[[[[1 2 3 4]]]]]
shape of array: (1, 1, 1, 1, 4)
10.数组重塑
重塑:重塑数组形状,使用reshape()
将1-D数组重塑为2-D数组
#将具有12个元素的1-D数组转化为2-D数组```
#最外面的维度将4个数组,每个数组包含三个元素
import numpy as np
arr = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
newarr = arr.reshape(4,3)
newarr
array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])
将1-D重塑为3-D数组
#将12个元素的1-D数组转换为3-D数组
#最外面维度将具有2个数组, 包含3个数组,每个数组包含2个元素
import numpy as np
arr = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
newarr = arr.reshape(2,3,2)
newarr
array([[[ 1, 2],
[ 3, 4],
[ 5, 6]],
[[ 7, 8],
[ 9, 10],
[11, 12]]])
展平数组,将多维数组展开,变成1D数组,使用reshape(-1)
import numpy as np
arr = np.array([[1,2,3],[4,5,6]])
newarr = arr.reshape(-1)
newarr
array([1, 2, 3, 4, 5, 6])
11.数组迭代
迭代意味着逐一历遍元素,使用for循环来完成
for x in arr pront(x)
#迭代以下1-D数组的元素
import numpy as np
arr = np.array([1,2,3])
for x in arr:
print(x)
1
2
3
#迭代2-D数组的每一个标量元素
import numpy as np
arrr = np.array([[1,2,3],[4,5,6]])
for x in arr:
for y in x:
print(y)
[1 2 3]
[4 5 6]
#迭代2-D数组的每一个标量元素
import numpy as np
arrr = np.array([[1,2,3],[4,5,6]])
for x in arr:
for y in x:
print(y)
1
2
3
4
5
6
#迭代3-D数组,遍历所有的2-D数组
import numpy as np
arr = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
for x in arr:
print(x)
[[1 2 3]
[4 5 6]]
[[ 7 8 9]
[10 11 12]]
迭代不同数据类型的数组
使用op_dtypes参数,并传递期望的数据类型,在迭代时更改元素的数据类型
numpy不会就此更改元素的数据类型,因为他需要其他空间执行操作,使用传参flags=[‘buffered’]
#以字符串形式遍历数组
import numpy as np
arr = np.array([1,2,3])
for x in np.nditer(arr,flags=['buffered'],op_dtypes=['S']):
print(x)
b'1'
b'2'
b'3'
以不同的步长迭代
使用过滤,然后在进行迭代
#每遍历2D数组的一个标量,跳过一个元素
import numpy as np
arr = np.array([[1,2,3,4],[5,6,7,8]])
for x in np.nditer(arr[:,::2]):
print(x)
1
3
5
7
使用udenumerate()进行枚举迭代
枚举:逐一提及事物的序号
#枚举一下1D数组元素:
import numpy as np
arr = np.array([1,2,3])
for idx,x in np.ndenumerate(arr):
print(idx,x)
(0,) 1
(1,) 2
(2,) 3
#枚举以下2D数组元素
import numpy as np
arr = np.array([[1,2,3,4],[5,6,7,8]])
for idx,x in np.ndenumerate(arr):
print(idx,x)
(0, 0) 1
(0, 1) 2
(0, 2) 3
(0, 3) 4
(1, 0) 5
(1, 1) 6
(1, 2) 7
(1, 3) 8
12.数组连接
连接:将两个或多个数组的内容放在单个数组中。在Numpy中,按轴连接数组,使用concatenate()函数,若未显示传递轴则将视为0。
#连接两个数组
import numpy as np
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
arr = np.concatenate((arr1,arr2))
arr
array([1, 2, 3, 4, 5, 6])
#沿着(axis=1)连接两个2-D数组
import numpy as np
arr1 = np.array([[1,2,],[3,4]])
arr2 = np.array([[5,6,],[7,8]])
arr = np.concatenate((arr1,arr2),axis=1)
arr
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
使用堆栈函数连接数组
堆叠(stacking):沿着第二个轴连接两个一维数组,大致他们重叠
import numpy as np
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
arr = np.stack((arr1,arr2),axis=1)
print(arr)
[[1 4]
[2 5]
[3 6]]
沿行堆叠,使用函数hstack()
import numpy as np
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
arr = np.hstack((arr1,arr2))
arr
array([1, 2, 3, 4, 5, 6])
沿列堆叠,使用函数vstack()
import numpy as np
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
arr = np.vstack((arr1,arr2))
arr
array([[1, 2, 3],
[4, 5, 6]])
沿高度堆叠(深度)
根据数组的深度进行堆叠成几个元素的数组
import numpy as np
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
arr = np.dstack((arr1,arr2))
arr
array([[[1, 4],
[2, 5],
[3, 6]]])
13.数组拆分
使用array_split( )分割函数,array_split(arr,3 )逗号前面是要分割的数组,后面是要分割的数目。
#将数组分为3部分
import numpy as np
arr = np.array([1,2,3,4,5,6])
newarr = np.array_split(arr,3)
newarr
[array([1, 2]), array([3, 4]), array([5, 6])]
#将数组分为2部分
import numpy as np
arr = np.array([1,2,3,4,5,6])
newarr = np.array_split(arr,2)
newarr
[array([1, 2, 3]), array([4, 5, 6])]
#将数组分为4部分
import numpy as np
arr = np.array([1,2,3,4,5,6])
newarr = np.array_split(arr,4)
newarr
[array([1, 2]), array([3, 4]), array([5]), array([6])]
访问拆分数组
分割后的数组,可以像使用元素一样结果中访问
import numpy as np
arr = np.array([1,2,3,4,5,6])
newarr = np.array_split(arr,3)
print(newarr[0])
print(newarr[1])
print(newarr[2])
[1 2]
[3 4]
[5 6]
分割二维数组
依旧使用array_split( )
#把2-D拆分为三个2-D数组
import numpy as np
arr = np.array([[1,2,],[3,4],[5,6],[7,8],[9,10],[11,12]])
newarr = np.array_split(arr,3)
newarr
[array([[1, 2],
[3, 4]]), array([[5, 6],
[7, 8]]), array([[ 9, 10],
[11, 12]])]
14.数组搜索
使用where()进行搜索
#查找值为4的索引
import numpy as np
arr = np.array([1,2,3,4,5,4,4])
x = np.where(arr==4)
print(x) #x会返回一个元组array([3,5,6]),代表索引3,5,6出现值4
(array([3, 5, 6], dtype=int64),)
#查找值为偶数的索引
import numpy as np
arr = np.array([1,2,3,4,5,6,7,8])
x = np.where(arr%2 ==0)
x
(array([1, 3, 5, 7], dtype=int64),)
#查找值为奇数的索引
import numpy as np
arr = np.array([1,2,3,4,5,6,7,8])
x = np.where(arr%2 ==1)
x
(array([0, 2, 4, 6], dtype=int64),)
15.数组排序
排序是指将元素按有序顺序排列
有序顺序:拥有与元素相应的顺序的任何序列,例数字、字母、升序、降序
函数sort():对指定的数组进行排序
#对数组排序
import numpy as np
arr = np.array([3,2,0,1])
print(np.sort(arr))
[0 1 2 3]
#对数组以字母顺序进行排序
import numpy as np
arr = np.array(['banana','cherry','apple'])
print(np.sort(arr))
['apple' 'banana' 'cherry']
#对布尔数组进行排序
import numpy as np
arr = np.array([True,False,True])
print(np.sort(arr))
[False True True]
对2-D数组排序
import numpy as np
arr = np.array([[3,2,4],[5,0,1]])
np.sort(arr)
array([[2, 3, 4],
[0, 1, 5]])
16.数组过滤
数组过滤:从从现有数组中提取一些元素并从中创建新的数组成为过滤
使用布尔索引列表进行过滤数组
布尔索引列表是与数组中的索引相应的的布尔值列表
如果索引处的值为True,则该元素保留在过滤后的数组
如果索引处的值为False,该元素将在过滤后排除
#用索引0、2、4上的元素创建一个数组
import numpy as np
arr = np.array([61,62,63,64,65])
x = [True ,False,True,False,True]
newarr = arr[x]
newarr
array([61, 63, 65])
创建过滤器数组
创建一个仅返回大于62的值过滤器数组
import numpy as np
arr = np.array([61,62,63,64,65])
#创建一个空列表
filter_arr = []
#遍历arr中的每一个元素
for element in arr:
#如果元素大于62,则将值设置为Ture,否则为False
if element>62:
filter_arr.append(True)
else:
filter_arr.append(False)
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)
[False, False, True, True, True]
[63 64 65]
创建一个仅返回原始数组中的偶数元素
import numpy as np
arr = np.array([1,2,3,4,5,6,7])
#创建一个空列表
filter_arr = []
#遍历arr的每一个元素
for element in arr:
if element %2 ==0:
filter_arr.append(True)
else:
filter_arr.append(False)
newarr = arr[filter_arr]
print (filter_arr)
print(newarr)
[False, True, False, True, False, True, False]
[2 4 6]
直接在数组中创建过滤器
创建一个仅返回大于62的值的过滤器数组
import numpy as np
arr = np.array([61,62,63,64,65])
filter_arr = arr>62
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)
[False False True True True]
[63 64 65]
#返回原始数组的偶数元素
import numpy as arr
arr = np.array([1,2,3,4,5,6,7])
filter_arr = arr%2==0
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)
[False True False True False True False]
[2 4 6]
17.随机数
随机:意味着无法在逻辑上预测的事物
伪随机:通过算法生成的随机数称为伪随机数
生成随机数,使用random模块
#生成一个0到100之间的随机整数
from numpy import random
x = random.randint(100)
x
77
#random 模块的rand()方法返回0到1之间的随机浮点数
from numpy import random
x = random.rand()
x
0.6164945941781393
生成随机数组
整数:randint()方法接受size参数,可以在其中指定数组的形状
#生成一个1-D数组,包含5个从0到100之间的随机整数
from numpy import random
x = random.randint(100,size=(5))
x
array([61, 81, 33, 79, 33])
#生成有3行的2-D数组,每行包含5个从0到100之间的随机整数
from numpy import random
x = random.randint(100,size=(3,5))
x
array([[ 1, 93, 77, 87, 16],
[62, 98, 99, 26, 0],
[17, 30, 77, 31, 22]])
#生成包含5个随机浮点数的1-D数组
from numpy import random
x = random.rand(5)
x
array([0.58978762, 0.03154268, 0.20103165, 0.91445395, 0.10420985])
#生成有3行的2-D数组,每行包含5个随机数
from numpy import random
x = random.rand(3,5)
x
array([[0.83131402, 0.05429738, 0.66807952, 0.60255511, 0.24944341],
[0.37721141, 0.2402024 , 0.28567492, 0.66272402, 0.23950599],
[0.39026378, 0.10668089, 0.28571608, 0.94200159, 0.2148401 ]])
从数组生成随机数
choice():可以基于值数组生成随机值
choice():将数组作为参数,并返回其中一个值
#返回数组中的值
from numpy import random
x = random.choice([3,5,7,9])
x
7
#生成一个由数组参数(3,5,7,9)中的值组成二维数组
from numpy import random
x = random.choice([3,5,7,9],size=(3,5))
x
array([[3, 9, 7, 7, 5],
[9, 5, 5, 3, 5],
[9, 9, 5, 3, 9]])