1 NumPy简介
简单来说NumPy的功能就是就是对可以一个数值集合(eg:数组)进行各种各样的操作。
NumPy(Numerical Python)是Python的一种开源的 数值计算扩展。提供多维数组对象,各种派生对
象(如掩码数组和矩阵),这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested
list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)), 支持大量的维度数组与矩阵
运算,此外也针对数组运算提供大量的数学函数库,包括数学、逻辑、形状操作、排序、选择、输入输
出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。
- 使用需要 安装numpy库(注意:首先要在电脑中安装的有python),安装方式如下:
(1) *第一种方式:
pip install jupyter -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
然后在你想要存放文件的目录打开cmd输入:jupyter notebook
(2) 第二种方式:
直接安装anaconda下载,它自带jupyter notebook(安装anaconda的过程中记得有个 Add Path
选项 一定要勾上,以免后面自己添加环境变量很麻烦)
- 前置知识
(1)如何启动终端
Windows—-> 快捷键:win + R —–>输入:cmd回车——>命令行出来
Mac —->启动终端
(2)启动jupyter notebook
进入终端输入指令:jupyter notebook
在哪里启动jupyter启动,浏览器上的目录,对应哪里,windows默认路径是:
C:\Users\lufengkun
C:\Users\xxx
(3)jupyter notebook更过内容(例如扩展的使用,请阅读:https://blog.csdn.net/qq_34516746/article/details/124147543?spm=1001.2014.3001.5501)
2 基本操作
2.1 数组创建
创建数组的最简单的方法就是使用array函数,将Python下的list转换为ndarray。
import numpy as np
l = [1,2,3,5,7,9]
arr = np.array(l)
arr
我们可以利用np中的一些内置函数来创建数组,比如我们创建全0的数组,也可以创建全1数组,全是其
他数字的数组,或者等差数列数组,正态分布数组,随机数。
import numpy as np arr1 = np.ones(10)
arr2 = np.zeros(10)
arr3 = np.full(shape = [2,3],fill_value=2.718)
arr4 = np.arange(start = 0,stop = 20,step = 2)
arr5 = np.linspace(start =0,stop = 9,num = 10)
arr6 = np.random.randint(0,100,size = 10)
arr7 = np.random.randn(5)
arr8 = np.random.random(size = 5)
2.2 查看操作
NumPy的数组类称为ndarray,也被称为别名 array。请注意,numpy.array这与标准Python库类不同
array.array,后者仅处理一维数组且功能较少。ndarray对象的重要属性是
- 数组的(1)轴数、(2)维数、(3)尺寸形状、(4)元素总数、(5)数组类型、(6)数组中每个元素的大小(以字节为单位)
import numpy as np
arr = np.random.randint(0,100,size=(3,4,5))
arr.ndim
arr.shape
arr.shape
arr.size
arr.dtype
arr.itemsize
2.3 文件IO操作
2.3.1 保存数组
save方法保存ndarray到一个npy文件,也可以使用savez将多个array保存到一个.npz文件中
import numpy as np
x = np.random.randn(5)
y = np.arange(0,10,1)
np.save("x_arr",x)
np.savez("some_array.npz",xarr=x,yarr=y)
2.3.2 读取
load方法来读取存储的数组,如果是.npz文件的话,读取之后相当于形成了一个key-value类型的变量,通过保存时定义的key来获取相应的array
import numpy as np
np.load("x_arr.npy")
np.load("some_array.npz")["yarr"]
2.3.3 读写csv、txt文件
import numpy as np
arr = np.random.randint(0,10,size=(3,4))
np.savetxt("arr.csv",arr,delimiter=',')
np.loadtxt("arr.csv",delimiter=',',dtype=np.int32)
3 数据类型的设置和转化
- ndarray的数据类型:
(1) int: int8、uint8、int16、int32、int64
(2) float: float16、float32、float64
(3) *str
import numpy as np
arr = np.array([1,2,5,8,2],dtype='float32')
arr = [1,3,5,7,2,9,0]
arr = np.asarray(arr,dtype='float32')
arr = np.random.randint(0,10,size=5,dtype='int16')
arr = arr.astype(dtype='float32')
4 数组运算
- 加减乘除运算
import numpy as np
arr1 = np.array([1,2,3,4,5])
arr2 = np.array([2,3,1,5,9])
arr1 - arr2
arr1 * arr2
arr1 / arr2
arr1 // arr2
arr1**arr2
- 逻辑运算
import numpy as np
arr1 = np.array([1,2,3,4,5])
arr2 = np.array([1,0,2,3,5])
arr1 < 5
arr1 > 5
arr1 == 5
arr1 == arr2
arr1 > arr2
- 数组和标量(就是一个数)的计算
import numpy as np
arr = np.arange(1,10)
1/arr
arr+5
arr*5
-
- =、+=、-=操作
某些操作(例如+=和=)只会修改现有数组,而不是创建一个新数组。
- =、+=、-=操作
import numpy as np
arr1 = np.arange(5)
arr1 +=5
arr1 -=5
arr1 *=5
5 复制和视图
在操作数组时,有时会将其数据复制到新数组中,有时不复制。对于初学者来说,这通常会引起混乱。有以下三种情况
- 完全没有复制(两个是一个东西)
import numpy as np
a = np.random.randint(0,100,size=(4,5))
b = a
a is b
b[0,0] = 1024
display(a,b)
- 查看或者浅拷贝
不同的数组对象可以共享相同的数据。该view方法创建一个查看相同数据的新数组对象
import numpy as np
a = np.random.randint(0,100,size=(4,5))
b = a.view()
a is b
b.base is a
b.flags.owndata
a.flags.owndata
b[0,0] = 1024
display(a,b)
- 深拷贝
import numpy as np
a = np.random.randint(0,100,size=(4,5))
b = a.copy()
b is a
b.base is a
b.flags.owndata
a.flags.owndata
b[0,0] = 1024
display(a,b)
注意:copy应该在 不再需要原来的数组情况下,切片后调用。例如:假设a是一个巨大的中间结果,而最
终结果b仅包含的一小部分a,则在b使用切片进行构造时应制作一个深拷贝:
import numpy as np
a = np.arange(1e8)
b = a[::1000000].copy()
del a
b.shape
5 索引、切片和迭代
5.1 基本索引和切片
numpy中数组切片是原始数组的视图,这意味着数据不会被复制,视图上任何数据的修改都会反映到原
数组上。
import numpy as np
arr = np.array([0,1,2,3,4,5,6,7,8,9])
arr[5]
arr[5:8]
arr[2::2]
arr[::3]
arr[1:7:2]
arr[::-1]
arr[::-2]
arr[5:8] = 12
temp = arr[5:8]
temp[1] = 1024
arr
对于二维数组或者高维数组,我们可以按照之前的知识来索引,当然也可以传入一个以逗号隔开的索引
列表来选区单个或多个元素
import numpy as np
arr2d = np.array([[1,3,5],[2,4,6],[-2,-7,-9],[6,6,6]])
arr2d.shape
arr2d
arr2d[0,-1]
arr2d[0,2]
arr2d[:2,-2:]
arr2d[:2,1:]
5.2 花式索引和索引技巧
- 整数数组进行索引即花式索引,其和切片不一样,它总是将数据复制到新数组中
import numpy as np
arr1 = np.array([1,2,3,4,5,6,7,8,9,10])
arr2 = arr1[[1,3,3,5,7,7,7]]
arr2[-1] = 1024
arr2d = np.array([[1,3,5,7,9],[2,4,6,8,10],[12,18,22,23,37],[123,55,17,88,103]])
arr2d.shape
arr2d[[1,3]]
arr2d[([1,3],[2,4])]
arr2d[np.ix_([1,3,3,3],[2,4,4])]
arr2d[[1,3,3,3]][:,[2,4,4]]
- *boolean值的索引
import numpy as np
names = np.array(['softpo','Brandon','Will','Michael','Will','Ella','Daniel','softpo','Will','Brandon'])
cond1 = names =='Will'
cond1
names[cond1]
arr = np.random.randint(0,100,size=(10,8))
cond2 = arr > 90
arr[cond2]
6 形状操作
6.1 数组变形
import numpy as np
arr1 = np.random.randint(0,10,size=(3,4,5))
arr2 = arr1.reshape(12,5)
arr3 = arr1.reshape(-1,5)
arr3 = arr1.reshape(-1,6)
6.2 数组转置
import numpy as np
arr1 = np.random.randint(0,10,size=(3,5))
arr1.T
arr2 = np.random.randint(0,10,size=(3,6,4))
np.transpose(arr2,axes=(2,0,1))
6.3 数组堆叠
import numpy as np
arr1 = np.array([[1,2,3]])
arr2 = np.array([[4,5,6]])
np.concatenate([arr1,arr2],axis=0)
np.concatenate([arr1,arr2],axis=1)
np.hstack((arr1,arr2))
np.vstack((arr1,arr2))
6.4 split数组拆分
import numpy as np
arr = np.random.randint(0,10,size=(6,5))
arr1,arr2 = np.split(arr,indices_or_sections=2,axis=0)
display(arr1,arr2)
np.split(arr,indices_or_sections=[2,3],axis=1)
np.vsplit(arr,indices_or_sections=3)
np.hsplit(arr,indices_or_sections=[1,4])
7 广播机制
当两个数组的形状并不相同的时候,我们可以通过扩展数组的方法来实现相加、相减、相乘等操作,这
种机制叫做广播(broadcasting)。
- 一维数组的广播
import numpy as np
arr1 = np.sort(np.array([0,1,2,3]*3)).reshape(4,3)
arr2 = np.array([1,2,3])
arr3 = arr1 + arr2
arr3
- 二维数组的广播
import numpy as np
arr1 = np.sort(np.array([0,1,2,3]*3)).reshape(4,3)
arr2 = np.array([[1],[2],[3],[4]])
arr3 = arr1 + arr2
arr3
- 三维数组广播
import numpy as np
arr1 = np.array([0,1,2,3,4,5,6,7]*3).reshape(3,4,2)
arr2 = np.array([0,1,2,3,4,5,6,7]).reshape(4,2)
arr3 = arr1 + arr2
arr3
8 通用函数
8.1 元素级数字函数
abs、sqrt、square、exp、log、sin、cos、tan,maxinmum、minimum、all、any、inner、clip、round、trace、ceil、floor
import numpy as np
arr1 = np.array([1,4,8,9,16,25])
np.sqrt(arr1)
np.square(arr1)
np.clip(arr1,2,16)
x = np.array([1,5,2,9,3,6,8])
y = np.array([2,4,3,7,1,9,0])
np.maximum(x,y)
arr2 = np.random.randint(0,10,size = (5,5))
np.inner(arr2[0],arr2)
8.2 where函数
where 函数,三个参数,条件为真时选择值的数组,条件为假时选择值的数组
import numpy as np
arr1 = np.array([1,3,5,7,9])
arr2 = np.array([2,4,6,8,10])
cond = np.array([True,False,True,True,False])
np.where(cond,arr1,arr2)
arr3 = np.random.randint(0,30,size = 20)
np.where(arr3 < 15,arr3,-15)
8.3 排序方法
np中还提供了排序方法,排序方法是就地排序,即直接改变原数组
arr.sort()、np.sort()、arr.argsort()
import numpy as np
arr = np.array([9,3,11,6,17,5,4,15,1])
arr.sort()
np.sort(arr)
arr = np.array([9,3,11,6,17,5,4,15,1])
arr.argsort()
8.4 集合运算函数
import numpy as np
A = np.array([2,4,6,8])
B = np.array([3,4,5,6])
np.intersect1d(A,B)
np.union1d(A,B)
np.setdiff1d(A,B)
8.5 数学和统计函数
min、max、mean、median、sum、std、var、cumsum、cumprod、argmin、argmax、argwhere、cov、corrcoef
import numpy as np
arr1 = np.array([1,7,2,19,23,0,88,11,6,11])
arr1.min()
arr1.argmax()
np.argwhere(arr1 > 20)
np.cumsum(arr1)
arr2 = np.random.randint(0,10,size = (4,5))
arr2.mean(axis = 0)
arr2.mean(axis = 1)
np.cov(arr2,rowvar=True)
np.corrcoef(arr2,rowvar=True)
9 线性代数
9.1 矩阵乘积
import numpy as np
A = np.array([[4,2,3], [1,3,1]])
B = np.array([[2,7], [-5,-7], [9,3]])
np.dot(A,B)
A @ B
9.2 矩阵的其他计算
from numpy.linalg import inv,det,eig,qr,svd
A = np.array([[1,0,0],
[0,2,0],
[0,0,3]])
inv(A)
det(A)
10 练习实例
1、创建一个长度为10的一维全为0的ndarray对象,然后让第5个元素等于1
import numpy as np
arr = np.zeros(10,dtype = 'int')
arr[4] = 1
arr
2、创建一个元素为从10到49(包含49)的ndarray对象,间隔是1
import numpy as np
arr = np.arange(10,50)
arr
3、将第2题的所有元素位置反转
import numpy as np
arr = np.arange(10,50)
arr = arr[::-1]
arr
4、使用np.random.random创建一个10*10的ndarray对象,并打印出最大最小元素
import numpy as np
arr = np.random.random(size = (10,10))
print('输出最大值:',arr.max())
print('输出最小值:',arr.min())
5、创建一个10*10的ndarray对象,且矩阵边界全为1,里面全为0
import numpy as np
arr = np.full(shape = (10,10),fill_value=0,dtype=np.int)
arr[[0,-1]] = 1
arr[:,[0,-1]] = 1
arr
6、创建一个每一行都是从0到4的5*5矩阵
import numpy as np
arr = np.zeros((5,5))
arr += np.arange(5)
print(arr)
7、创建一个范围在(0,1)之间的长度为12的等差数列,创建[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]等比数列。
import numpy as np
arr = np.linspace(0,1,12)
display(arr)
arr2 = np.logspace(0,10,base=2,num = 11,dtype='int')
arr2
8、创建一个长度为10的正太分布数组np.random.randn并排序
import numpy as np
arr = np.random.randn(10)
print('未排序:',arr)
arr2 = np.sort(arr)
print('排序后:',arr2)
9、创建一个长度为10的随机数组并将最大值替换为-100
import numpy as np
np.set_printoptions(suppress = True)
arr = np.random.random(10)
print('原数据:\n',arr)
v = arr.max()
cond = arr == v
arr[cond] = -100
print('修改之后数据:\n',arr)
10、如何根据第3列大小顺序来对一个5*5矩阵排序?(考察argsort()方法)
np.random.seed(10)
arr = np.random.randint(0,10,(5,5))
print('原始数据:\n',arr)
print('第三列数据:', arr[:,2])
print('第三列数据的排序:',np.argsort(arr[:,2]))
print('根据第三列大小排序:\n',arr[np.argsort(arr[:,2])])
Original: https://blog.csdn.net/qq_34516746/article/details/124266686
Author: jaydenStyle
Title: NumPy科学计算库(1)Python数据分析
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/759253/
转载文章受原作者版权保护。转载请注明原作者出处!