Numpy

第一章 :Jupyter Notebook

与pycharm类似,编写python代码
本质是Web应用程序

01.启动

Anaconda Prompt —>jupyter notebook
Jupyter Notebook (代码不存放在C盘不建议使用)
③长按Shift+鼠标右键 —>终端打开 —>jupytr notebook(推荐)

02.编辑模式,命令模式

·编辑模式:允许向单元键中写入代码或文本,单元框为绿色
·命令模式:键盘输入运行程序命令,单元框为蓝色

03.快捷键

Shift + Enter : 运行本单元,选中下个单元
Ctrl + Enter : 运行本单元
Alt + Enter : 运行本单元,在其下插入新单元
Y : 单元转入代码状态
M : 单元转入markdown状态
A : 在上方插入新单元
B : 在下方插入新单元
DD : 删除选中的单元
Ctrl + A : 全选
Ctrl + Z : 撤销
Ctrl + C : 复制
Ctrl + V : 粘贴
Ctrl + / : 注释或取消注释

04.帮助文档和自动补全

帮助文档 help(函数) 或者 函数?
自动补全 tab:代码补全或缩进

05.魔法命令%run

先建文件myscript.py

def square(x):
    return x**2
for N in range(1,4):
    print(N,"squared is",square(N))

再在输入框中写%run myscript.py或者import myscript
可以直接运行,或调用函数啦
输入框中有多条命代码时,只会运行最后一条
想要运行多条代码的解决方法:
①逗号分隔法
变量接收
变量间用逗号隔开
eg.

a = square(5)
b = square(6)
a,b

运行结果:(25, 36)
ps:用元组接收结果
display()
变量接收

display(变量1,变量2,...)
eg.a = square(5)
b = square(6)
display(a,b)

运行结果:

25
36

print()
变量接收

print(变量1,变量2,...)

eg.

a = square(5)
b = square(6)
print(a,b)

运行结果:25,36

06. %time&%timeit

①%time :一般用来统计耗时较长代码的运行时长
语法:%time 代码
eg.%time square(1000)
运行结果:0ns
②%timeit:会多次运行代码,得到一个更为准确的运行时间,一般用来统计耗时较短代码的运行时长
语法:%timeit 代码
eg.%timeit square(100)
运行结果:281 ns ± 2.35 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
控制运行时间
eg.%timeit -r 2 -n 1000 square(100)
运行结果:386 ns ± 13.8 ns per loop (mean ± std. dev. of 2 runs, 1000 loops each)
③多行代码查看运行时间
语法:

%%timeit
代码1
代码2

eg.

%%timeit
square(100)
add(10, 20)

运行结果:345 ns ± 4.33 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

07.其他魔法命令

①%who:快速查看当前会话的所有变量与函数名称
语法:%who
eg.%who
运行结果:N a add b square
②%whos:查看当前会话的所有变量与函数名称的详细信息
语法:%whos
eg.%whos
运行结果:

Variable   Type        Data/Info
--------------------------------
N          int         3
a          int         25
add        function    <function add at 0x000001F93BF82158>
b          int         36
square     function    <function square at 0x000001F93C0ACF28>

③%who_ls:以列表形式显示当前会话的函数,变量
语法:%who_ls
eg.%who_ls
运行结果:['N', 'a', 'add', 'b', 'square']
④列出所有魔法命令
语法:Ismagic
eg.lsmagic
运行结果:

Available line magics:
%alias  %alias_magic  %autocall  %automagic  %autosave  %bookmark  %cd  %clear  %cls  %colors  %config  %connect_info  %copy  %ddir  %debug  %dhist  %dirs  %doctest_mode  %echo  %ed  %edit  %env  %gui  %hist  %history  %killbgscripts  %ldir  %less  %load  %load_ext  %loadpy  %logoff  %logon  %logstart  %logstate  %logstop  %ls  %lsmagic  %macro  %magic  %matplotlib  %mkdir  %more  %notebook  %page  %pastebin  %pdb  %pdef  %pdoc  %pfile  %pinfo  %pinfo2  %popd  %pprint  %precision  %profile  %prun  %psearch  %psource  %pushd  %pwd  %pycat  %pylab  %qtconsole  %quickref  %recall  %rehashx  %reload_ext  %ren  %rep  %rerun  %reset  %reset_selective  %rmdir  %run  %save  %sc  %set_env  %store  %sx  %system  %tb  %time  %timeit  %unalias  %unload_ext  %who  %who_ls  %whos  %xdel  %xmode

Available cell magics:
%%!  %%HTML  %%SVG  %%bash  %%capture  %%cmd  %%debug  %%file  %%html  %%javascript  %%js  %%latex  %%markdown  %%perl  %%prun  %%pypy  %%python  %%python2  %%python3  %%ruby  %%script  %%sh  %%svg  %%sx  %%system  %%time  %%timeit  %%writefile

Automagic is ON, % prefix IS NOT needed for line magics.

⑤查看%run的帮助文档
语法:%run?
运行结果:过长,自行敲

08.练习

①封装函数求闰年
代码1:

def is_leap(year):
    return year % 4 ==0 and year % 100 != 0 or year % 400 ==0

代码2:is_leap(2000)
运行结果:True
②封装函数实现冒泡排序
代码1:

def my_sort(l):
    for i in range(len(l) - 1):
        for j in range(len(l) - i - 1):
            if l[j] > l[j+1]:
                l[j], l[j+1] = l[j+1] , l[j]#交换位置
    return l

代码2:my_sort([1, 3, 6, 5, 2, 8, 7, 4])
运行结果:[1, 2, 3, 4, 5, 6, 7, 8]

第二章:NumPy

Python 的一个开源的数值计算库,可用来存储和处理大型矩阵,比python的嵌套列表结构高效很多
#%% md

01.开始学习NumPy

# 导包
import numpy as np
import matplotlib.pyplot as plt
# 查看版本
np.__version__

运行结果:'1.14.0'

# 图片是由数字组成的三维数组
# RGB:red,green,blue
# RGB:范围0~255


picture = plt.imread("2.1.jpg")
picture

运行结果:

array([[[  0,   2,   7],
        [  0,   2,   7],
        [  0,   2,   7],
        ...,
        [  0,   3,   6],
        [  0,   3,   6],
        [  0,   3,   6]],

       [[  0,   2,   7],
        [  0,   2,   7],
        [  0,   2,   7],
        ...,
        [  0,   3,   6],
        [  0,   3,   6],
        [  0,   3,   6]],

       [[  0,   2,   7],
        [  0,   2,   7],
        [  0,   2,   7],
        ...,
        [  0,   3,   6],
        [  0,   3,   6],
        [  0,   3,   6]],

       ...,

       [[  0,  79, 146],
        [  0,  79, 146],
        [  0,  79, 146],
        ...,
        [  2,  49,  93],
        [  1,  48,  92],
        [  1,  48,  92]],

       [[  0,  79, 148],
        [  0,  79, 148],
        [  0,  79, 148],
        ...,
        [  1,  49,  95],
        [  1,  49,  95],
        [  1,  49,  95]],

       [[  0,  81, 151],
        [  0,  81, 151],
        [  0,  80, 151],
        ...,
        [  2,  50,  96],
        [  2,  50,  96],
        [  2,  50,  96]]], dtype=uint8)
type(picture)
# numpy.ndarray:多维数组
# nd:n维度
# 数组

运行结果:
numpy.ndarray

# 查看形状:三维
# (高,宽,RGB的值)
# 高:252行,宽度:500列,RGB的值:3
picture.shape

运行结果:(252, 500, 3)

# 显示图片
plt.imshow(picture)

图片:3维数据(彩色)
2维数据(黑白)
视频:4维数据(x,高,宽,RGB的值)
数据分析:一切皆数据,一切皆矩阵

02.创建ndarray数组

numpy默认numpy所有元素类型相同

如果传进来的列表包含不同的类型,则统一为同一类型,优先级:str>float>int
ndarray的常见数据类型:

int:int8,unit8(无符号,一个字节),int16,int32,int64
float:float16,float32,float64
str:字符串

①使用np.array()创建
eg.

l= [1,2,3]
 n = np.array(l)
 n

运行结果:array([1, 2, 3])

# 查看其类型
type(n)

运行结果:numpy.ndarray

# 查看其形状
# l.shape错的,l为列表,没有shape
n.shape

运行结果:(3,)

n=np.array([1,4,6,"hello",1.2])
n

运行结果:

array(['1', '4', '6', 'hello', '1.2'], dtype='<U11')

②使用np的routines函数创建
1)

np.ones(shape=,dtype=None,order='C')

创建一个所有元素都为1的多维数组
shape:形状
dtype=None,元素类型
order:“C”,"F"可选,"C"在内存中以行为主,"F"在内存中以列为主
一般默认即可

eg

n = np.ones(shape=(3,4))
n

运行结果:

array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])

eg

n = np.ones(shape=(3,4,5),dtype = np.int16)
n

运行结果:

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, 1, 1, 1, 1]],

       [[1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1]]], dtype=int16)

2)np.zeros(shape=,dtype=float,order='C')

创建一个所有元素都为0的多维数组
shape=:形状
dtype = None:元素类型
eg.

n = np.zeros(shape=(3,4),dtype = np.int16)
n

运行结果:

array([[0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]], dtype=int16)

3)np.full(shape=,fill_value,dtype=None,order='C')

创建一个所有元素都为指定元素的多维数组
shape:形状
fill_value:填充值
dtype = None:元素类型
eg.

n= np.full(shape=(3,5),fill_value = 7,dtype=np.int8)
n

运行结果:

array([[7, 7, 7, 7, 7],
       [7, 7, 7, 7, 7],
       [7, 7, 7, 7, 7]], dtype=int8)

4)np.eye(N,M=None,k=0,dtype=float)

对角线为1其他为0的二维数组
N:行数
M:列数,默认为None,和行一样
k=0:对角线每个都向右偏移0个位置,负数向左偏,正数向右偏
dtype=None:元素类型
eg.

n = np.eye(6,6,k=2,dtype=np.int8)
n

运行结果:

array([[0, 0, 1, 0, 0, 0],
       [0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0]], dtype=int8)

5)np.linspace(start,num=50,endpoint=True,retstep=False.dtype=None)

创建一个等差数列
start:开始值
stop:结束值
num = 50:等差数列中默认有50个数
endpoint=True :是否有返回值
retstep=False:是否返回等差值(步长)
dtype=None:元素类型
eg.

n = np.linspace(0,100,num=51,dtype=np.int8)
n

运行结果:

array([  0,   2,   4,   6,   8,  10,  12,  14,  16,  18,  20,  22,  24,
        26,  28,  30,  32,  34,  36,  38,  40,  42,  44,  46,  48,  50,
        52,  54,  56,  58,  60,  62,  64,  66,  68,  70,  72,  74,  76,
        78,  80,  82,  84,  86,  88,  90,  92,  94,  96,  98, 100],
      dtype=int8)

eg.

n = np.linspace(0,100,num=51,retstep=True,dtype=np.int8)
n

运行结果:

(array([  0,   2,   4,   6,   8,  10,  12,  14,  16,  18,  20,  22,  24,
         26,  28,  30,  32,  34,  36,  38,  40,  42,  44,  46,  48,  50,
         52,  54,  56,  58,  60,  62,  64,  66,  68,  70,  72,  74,  76,
         78,  80,  82,  84,  86,  88,  90,  92,  94,  96,  98, 100],
       dtype=int8), 2.0)

6)* np.arange([start]stop,[step,]dtype=None)

创建一个数值范围的数组
和Python中的range功能类似
start:开始值(可选)
stop:结束值(不包含)
step:步长(可选)
dtype=None:元素类型

eg.

n = np.arange(1,20,3)
n

运行结果:array([ 1, 4, 7, 10, 13, 16, 19])
7)* np.random.randint(low,high=None,size=None,dtype='l')

创建一个随机整数的多维数组
low:最小值
high = None:最大值
如果high=None,生成的数值在[0,low)之间
如果使用high这个值,生成的数值在[low,high)之间
size=None:数组形状,默认只输出一个随机值
dtype=None:元素类型
eg.

n = np.random.randint(3)
n

运行结果:0
eg.

# 一维随机整数
n = np.random.randint(3,10,size=6)
n

运行结果:array([3, 5, 4, 6, 5, 7])

# 二维随机整数
n = np.random.randint(3,10,size=(2,4))
n

运行结果:

array([[5, 6, 9, 6],
       [3, 7, 7, 5]])
# 三维随机整数,20个二维数组,一个数组40行3列
n = np.random.randint(0,256,size=(20,40,3))
n

运行结果:array([[[ 30, 122, 37],
[186, 184, 130],
[247, 44, 20],
…,
[209, 144, 86],
[188, 92, 110],
[ 28, 9, 94]],

   [[176, 176,  12],
    [189,  92, 160],
    [186,   4,  85],
    ...,
    [137, 202,  16],
    [ 37, 207, 171],
    [196, 194,  39]],

   [[149,  98, 220],
    [127, 174, 120],
    [143, 120,   0],
    ...,
    [141, 139, 117],
    [ 32, 208,  72],
    [ 67, 115, 109]],

   ...,

   [[ 64, 167, 237],
    [133,  62, 245],
    [187, 181, 193],
    ...,
    [229, 159,   2],
    [252,  89,   9],
    [208, 161, 205]],

   [[112,  97, 196],
    [123,  90, 134],
    [ 11, 255, 136],
    ...,
    [ 24, 189,  93],
    [102, 203, 228],
    [171, 216,  86]],

   [[242, 217, 108],
    [ 75,  75, 236],
    [119, 141, 237],
    ...,
    [ 79,  88,  38],
    [122,  28,  29],
    [145, 131, 105]]])

8)

np.random.randn(d0,d1,d2,...,dn)

创建一个服从标准正态分布的多维数组
标准正态分布:以0为均数,1为标准差的正态分布,在0左右出现的概率最大,越远离出现的概率越低

dn:第n个维度的数值

eg.

n = np.random.randn()
n

运行结果:1.908480407457795
eg.

n = np.random.randn(3,2)
n

运行结果:

array([[-0.9267283 , -1.30635666],
       [-0.20752876,  1.62608297],
       [ 0.47872274, -0.3451835 ]])

9)np.random.normal(loc=0.0,scale=1.0,size=None)

创建一个服从正态分布的多维数组
loc=0.0:均值对应着正态分布的中心
scale:标准差,对应着分布的宽度,scale越大,正态分布线越矮
size=None:形状
eg

n = np.random.normal(loc=100)
n

运行结果:99.84855773212374

n = np.random.normal(loc=100,size=(3,4))
n

运行结果:

array([[ 99.50714161, 100.62151901,  99.92331338,  98.46955622],
       [ 99.55422095, 101.83281471,  99.61578694,  99.47357688],
       [101.22157539,  99.48188286,  99.40355441,  98.68052448]])

10)* np.random.random(size=None)

创建一个元素0~1(左闭右开)的随机多维数组
size=None:数组形状
eg.

n =np.random.random(size=(3,4))
n

运行结果:

array([[0.55068558, 0.53786403, 0.49058346, 0.26086671],
       [0.52167294, 0.33862798, 0.97514859, 0.58315967],
       [0.26983238, 0.10702999, 0.84085722, 0.84733187]])
  1. np.random.rand(d0,d1,...,dn)

创建一个元素0~1(左闭右开)的随机多维数组
size=None:数组形状
np.random.random功能一致
eg.

n =np.random.random((3,4))
n

运行结果:

array([[0.93459021, 0.00843056, 0.39550054, 0.24297299],
       [0.66687175, 0.44803999, 0.5122349 , 0.27086015],
       [0.98702141, 0.17513857, 0.94381547, 0.54350168]])

03.ndarray的属性

ndim:维度
shape:形状
size:总长度,总数据量
dtype:元素类型

# 第一个维度:252
# 第二个维度:500
# 第三维度:3
# 有几个数字代表几维
picture.shape

运行结果:(252, 500, 3)

picture.ndim

运行结果:3

picture.size

运行结果:378000

picture.dtype

运行结果:dtype('uint8')

04.NumPy的常用操作

①索引
一维与列表完全一致,多维同理
eg

l = [1,2,4,74,2]
l[0],l[-1]

运行结果:(1, 2)

n=np.array(l)
n[0],n[-1]

运行结果:(1, 2)
eg

# 二维
n = np.random.randint(0,10,size=(3,4))
n

运行结果:

array([[9, 7, 1, 6],
       [8, 1, 6, 7],
       [6, 3, 7, 6]])

eg

n[2][3],n[1][0]

运行结果:(6, 8)

# 修改数据
n[1][0]=3
n

运行结果:

array([[9, 7, 1, 6],
       [3, 1, 6, 7],
       [6, 3, 7, 6]])

eg

n[1]=[1,2,3,4]
n

运行结果:

array([[9, 7, 1, 6],
       [1, 2, 3, 4],
       [6, 3, 7, 6]])

②切片

一维与列表完全一致,多维同理

l=[1,25,4,2,5.8,5,8,2,0]
l[2:8]  #切片

运行结果:[4, 2, 5.8, 5, 8, 2]
l[::-1] #翻转
运行结果:[0, 2, 8, 5, 5.8, 2, 4, 25, 1]
eg

n = np.array(l)
n[2:6],n[::-1]

运行结果:

(array([4. , 2. , 5.8, 5. ]),
 array([ 0. ,  2. ,  8. ,  5. ,  5.8,  2. ,  4. , 25. ,  1. ]))

eg

# 二维或多维
n = np.random.randint(1,20,size=(5,7))
n

运行结果:

array([[ 5,  9,  1, 18, 18,  9, 15],
       [ 7, 17, 13, 14,  5,  6, 18],
       [18,  2,  2, 13,  3,  1, 19],
       [12, 19, 12,  5,  3, 18, 14],
       [19, 12,  9,  1,  5,  4,  5]])
# 取一行,索引
# print(n[0]),运行结果:[ 5  9  1 18 18  9 15]
# 取连续多行:切片
print(n[1:4]) 

运行结果:

[[ 7 17 13 14  5  6 18]
 [18  2  2 13  3  1 19]
 [12 19 12  5  3 18 14]]
# 取不连续的多行:中括号
print(n[[1,4,3]])

运行结果:[[ 7 17 13 14 5 6 18]
[19 12 9 1 5 4 5]
[12 19 12 5 3 18 14]]

# 取一列
print(n[:,0])#取所有行和定0列,:做切片操作,现在没有对行进行切片操作
# 取连续多列:切片
print(n[:,2:5])
# 取不连续的多列:[]
print(n[:,[1,3,4]])

运行结果:
[ 5 7 18 12 19]
[[ 1 18 18]
[13 14 5]
[ 2 13 3]
[12 5 3]
[ 9 1 5]]
[[ 9 18 18]
[17 14 5]
[ 2 13 3]
[19 5 3]
[12 1 5]]

05.图片的翻转

eg

n = np.random.randint(0,100,size=[5,6])
n

运行结果:

array([[26, 98, 90, 71, 44, 38],
       [75, 24, 55,  6, 12, 71],
       [75,  6, 80, 45, 80, 64],
       [48, 37, 96, 33, 67, 76],
       [75, 44, 43, 93, 20, 82]])

eg

# 行翻转
print(n[::-1])
# 列翻转
print(n[:,::-1])

运行结果:

[[75 44 43 93 20 82]
 [48 37 96 33 67 76]
 [75  6 80 45 80 64]
 [75 24 55  6 12 71]
 [26 98 90 71 44 38]]
[[38 44 71 90 98 26]
 [71 12  6 55 24 75]
 [64 80 45 80  6 75]
 [76 67 33 96 37 48]
 [82 20 93 43 44 75]]

eg

# 行翻转
plt.imshow(picture[::-1])

行翻转
eg

# 列翻转
plt.imshow(picture[:,::-1])

列翻转
eg

# 对颜色翻转:RGB-->BGR
plt.imshow(picture[:,:,::-1])

颜色翻转

06.变形

eg

n = np.arange(1,21)
n

运行结果:
eg

array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
       18, 19, 20])
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
       18, 19, 20])

eg

# reshape:将数组改变形状
n.shape

运行结果:(20,)

# 变成二维
n2 = np.reshape(n,(4,5))
n2

运行结果:

array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20]])

eg


n2.shape

运行结果:(4, 5)

# 使用-1:表示任意剩余维度长度
print(n2.reshape(4,-1))
print(n2.reshape(-1,2))
print(n2.reshape(-1))

运行结果:

[[ 1  2  3  4  5]
 [ 6  7  8  9 10]
 [11 12 13 14 15]
 [16 17 18 19 20]]
[[ 1  2]
 [ 3  4]
 [ 5  6]
 [ 7  8]
 [ 9 10]
 [11 12]
 [13 14]
 [15 16]
 [17 18]
 [19 20]]
[ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20]
## NumPy数组的级联合并 

n = np.random.randint(0,100,size=(3,5))
n1 = np.random.randint(1,200,size=(3,5))
display(n,n1)

运行结果:

array([[82, 88, 27, 11, 16],
       [89, 50, 19, 90, 79],
       [53, 91, 42, 87, 56]])
array([[ 35,   1,  16, 159, 152],
       [ 53, 194,  39, 156, 140],
       [101,  86, 105,  94,  45]])

07.级联合并

语法①:np.concatenate((n,n1),axis=)

np.concatenate((n,n1))#默认上下级联即是axis=0,axis=0表示第一个维度(行)

运行结果:

array([[ 82,  88,  27,  11,  16],
       [ 89,  50,  19,  90,  79],
       [ 53,  91,  42,  87,  56],
       [ 35,   1,  16, 159, 152],
       [ 53, 194,  39, 156, 140],
       [101,  86, 105,  94,  45]])

eg

np.concatenate((n,n1),axis=1)#左右级联,axis=1表示第二个维度(列)

运行结果:

array([[ 82,  88,  27,  11,  16,  35,   1,  16, 159, 152],
       [ 89,  50,  19,  90,  79,  53, 194,  39, 156, 140],
       [ 53,  91,  42,  87,  56, 101,  86, 105,  94,  45]])

语法②:np.hstack((n,n1)):水平级联,左右合并
np.vstack((n,n1)):上下级联,垂直合并

np.hstack((n,n1))

运行结果:

array([[ 82,  88,  27,  11,  16,  35,   1,  16, 159, 152],
       [ 89,  50,  19,  90,  79,  53, 194,  39, 156, 140],
       [ 53,  91,  42,  87,  56, 101,  86, 105,  94,  45]])

eg

np.vstack((n,n1))

运行结果:

array([[ 82,  88,  27,  11,  16],
       [ 89,  50,  19,  90,  79],
       [ 53,  91,  42,  87,  56],
       [ 35,   1,  16, 159, 152],
       [ 53, 194,  39, 156, 140],
       [101,  86, 105,  94,  45]])

08.切分/拆分/分割

与级联类似,三个函数完成切分工作

·np.split
·np.vsplit
·np.hsplit

eg

n = np.random.randint(0,200,size=(8,6))
n

运行结果:

array([[ 20, 191, 162, 136,  51, 168],
       [171, 129, 119, 139,  56, 158],
       [ 92, 113,  58,  35, 127,  77],
       [150, 171,  77, 148, 137,  15],
       [187,  68, 145, 111, 147, 167],
       [191,  17, 164, 129,  40,  41],
       [125,   3,  55, 170, 162, 148],
       [ 49,  94,  15,  90, 116, 137]])

语法:np.vsplit(数组,分割数),np.hsplit(数组,分割数)
eg

# 垂直拆分,平均拆成4分
np.vsplit(n,4)

运行结果:

[array([[185,  38,   7, 142, 141, 176],
        [ 24,  87, 107,  20, 190, 183]]),
 array([[187,  38,   3,  76, 118,  60],
        [ 54,   0, 124,  63, 134,  54]]),
 array([[ 54,  19, 133,  53, 132,  65],
        [ 91, 183, 181,  66, 154, 118]]),
 array([[ 12, 110,  83, 155, 129, 135],
        [ 67,  81, 196,  52,  75,  32]])]

eg

# 按照指定位置拆分
np.vsplit(n,(1,2,5))

运行结果:

[array([[ 20, 191, 162, 136,  51, 168]]),
 array([[171, 129, 119, 139,  56, 158]]),
 array([[ 92, 113,  58,  35, 127,  77],
        [150, 171,  77, 148, 137,  15],
        [187,  68, 145, 111, 147, 167]]),
 array([[191,  17, 164, 129,  40,  41],
        [125,   3,  55, 170, 162, 148],
        [ 49,  94,  15,  90, 116, 137]])]
# 水平拆分
np.hsplit(n,3)

运行结果:

[array([[ 20, 191],
        [171, 129],
        [ 92, 113],
        [150, 171],
        [187,  68],
        [191,  17],
        [125,   3],
        [ 49,  94]]), array([[162, 136],
        [119, 139],
        [ 58,  35],
        [ 77, 148],
        [145, 111],
        [164, 129],
        [ 55, 170],
        [ 15,  90]]), array([[ 51, 168],
        [ 56, 158],
        [127,  77],
        [137,  15],
        [147, 167],
        [ 40,  41],
        [162, 148],
        [116, 137]])]
# 按照指定位置拆分
np.hsplit(n,(0,2,5))

运行结果:

[array([], shape=(8, 0), dtype=int32), array([[ 20, 191],
        [171, 129],
        [ 92, 113],
        [150, 171],
        [187,  68],
        [191,  17],
        [125,   3],
        [ 49,  94]]), array([[162, 136,  51],
        [119, 139,  56],
        [ 58,  35, 127],
        [ 77, 148, 137],
        [145, 111, 147],
        [164, 129,  40],
        [ 55, 170, 162],
        [ 15,  90, 116]]), array([[168],
        [158],
        [ 77],
        [ 15],
        [167],
        [ 41],
        [148],
        [137]])]

split:可以做水平或垂直拆分
axis = 0行
axis = 1列
默认按行拆分
语法np.split(矩阵,分割数,axis=)

np.split(n,2) #等效于np.split(n,2,axis=0)

运行结果:

[array([[ 20, 191, 162, 136,  51, 168],
        [171, 129, 119, 139,  56, 158],
        [ 92, 113,  58,  35, 127,  77],
        [150, 171,  77, 148, 137,  15]]),
 array([[187,  68, 145, 111, 147, 167],
        [191,  17, 164, 129,  40,  41],
        [125,   3,  55, 170, 162, 148],
        [ 49,  94,  15,  90, 116, 137]])]

eg

np.split(n,2,axis=1)

运行结果:

[array([[ 20, 191, 162],
        [171, 129, 119],
        [ 92, 113,  58],
        [150, 171,  77],
        [187,  68, 145],
        [191,  17, 164],
        [125,   3,  55],
        [ 49,  94,  15]]), array([[136,  51, 168],
        [139,  56, 158],
        [ 35, 127,  77],
        [148, 137,  15],
        [111, 147, 167],
        [129,  40,  41],
        [170, 162, 148],
        [ 90, 116, 137]])]

拆分图片
eg

picture.shape

运行结果:

(252, 500, 3)
plt.imshow(picture)

picture1 = np.split(picture,2)
picture1[0]#上半部分
picture1[1]#下半部分
plt.imshow(picture1[0])

在这里插入图片描述

plt.imshow(picture1[1])

在这里插入图片描述

plt.imshow(picture2[1])#右半部分
picture2 = np.split(picture,2,axis=1)
plt.imshow(picture2[1])#右半部分

plt.imshow(picture2[0])#左半部分
在这里插入图片描述

/拷贝

09.复制/副本/拷贝

copy()函数创建副本
eg

# 赋值:用同一个内存
n = np.arange(10)
n2 = n
n2[2] = 100
display(n,n2)

运行结果:

array([  0,   1, 100,   3,   4,   5,   6,   7,   8,   9])
array([  0,   1, 100,   3,   4,   5,   6,   7,   8,   9])

eg

# 拷贝
n = np.arange(10)
n2 = n.copy()
n2[1]=300
display(n,n2)

运行结果

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
array([  0, 300,   2,   3,   4,   5,   6,   7,   8,   9])

eg

n = np.random.randint(0,10,size=(3,4))
n2=n.copy()
n2[0,0]=3
display(n,n2)


运行结果:

array([[7, 3, 4, 0],
       [2, 3, 9, 9],
       [6, 6, 9, 0]])
array([[3, 3, 4, 0],
       [2, 3, 9, 9],
       [6, 6, 9, 0]])

10.Numpy的聚合操作

①求和np.sum
语法:np.sum(矩阵)
eg

n = np.arange(0,10)
display(n,np.sum(n))

运行结果

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
45

所有数求和
eg

n = np.random.randint(0,10,size=(3,4))
display(n,np.sum(n)) #np.sum(n)所有数求和

运行结果:

array([[1, 7, 8, 5],
       [3, 4, 6, 6],
       [0, 5, 3, 1]])
49

eg

# axis=0,每一列的多行求和
np.sum(n,axis=0)

运行结果:

array([ 4, 16, 17, 12])

eg

# axis=0,每一行的多列求和
np.sum(n,axis=1)

运行结果:

array([21, 19,  9])

②其他常见聚合函数
np.min 最小值
np.max 最大值
np.mean 平均值
np.average 平均值
np.median 中位数
np.percentile 百分位数
np.argmin 最小值对应的下标
np.argmax 最大值对应的下标
np.std 标准差
np.var 方差
np.power 次方,求幂
np.argwhere 按条件查找
np.nan:float类型
③np.sum 和 np.nansum(nan: not a number)
nan:数值类型,不是一个正常的数值,表示空
np.nan:float类型
eg

n  = np.array([1,2,np.nan])
n

运行结果:

array([ 1.,  2., nan])
np.sum(n)#无法求出和
nan

eg
数的和

np.nansum(n)#排除nan后剩下数的和

运行结果:

3.0

11.NumPy的矩阵操作

①基本矩阵操作
·加减乘除

n = np.random.randint(10,100,size=(5,6))
n

运行结果:

array([[80, 65, 32, 22, 54, 83],
       [83, 94, 39, 55, 15, 13],
       [34, 62, 77, 58, 22, 77],
       [55, 15, 80, 66, 96, 86],
       [56, 48, 40, 81, 79, 94]])

eg

display(n + 100,n-100,n*2,n/2,n//2,n**2,n%2)

运行结果:

array([[180, 165, 132, 122, 154, 183],
       [183, 194, 139, 155, 115, 113],
       [134, 162, 177, 158, 122, 177],
       [155, 115, 180, 166, 196, 186],
       [156, 148, 140, 181, 179, 194]])
array([[-20, -35, -68, -78, -46, -17],
       [-17,  -6, -61, -45, -85, -87],
       [-66, -38, -23, -42, -78, -23],
       [-45, -85, -20, -34,  -4, -14],
       [-44, -52, -60, -19, -21,  -6]])
array([[160, 130,  64,  44, 108, 166],
       [166, 188,  78, 110,  30,  26],
       [ 68, 124, 154, 116,  44, 154],
       [110,  30, 160, 132, 192, 172],
       [112,  96,  80, 162, 158, 188]])
array([[40. , 32.5, 16. , 11. , 27. , 41.5],
       [41.5, 47. , 19.5, 27.5,  7.5,  6.5],
       [17. , 31. , 38.5, 29. , 11. , 38.5],
       [27.5,  7.5, 40. , 33. , 48. , 43. ],
       [28. , 24. , 20. , 40.5, 39.5, 47. ]])
array([[40, 32, 16, 11, 27, 41],
       [41, 47, 19, 27,  7,  6],
       [17, 31, 38, 29, 11, 38],
       [27,  7, 40, 33, 48, 43],
       [28, 24, 20, 40, 39, 47]], dtype=int32)
array([[6400, 4225, 1024,  484, 2916, 6889],
       [6889, 8836, 1521, 3025,  225,  169],
       [1156, 3844, 5929, 3364,  484, 5929],
       [3025,  225, 6400, 4356, 9216, 7396],
       [3136, 2304, 1600, 6561, 6241, 8836]], dtype=int32)
array([[0, 1, 0, 0, 0, 1],
       [1, 0, 1, 1, 1, 1],
       [0, 0, 1, 0, 0, 1],
       [1, 1, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 0]], dtype=int32)

eg

n2 = np.random.randint(10,100,size=(5,6))
n2
n2 = np.random.randint(10,100,size=(5,6))
n2
display(n+n2,n-n2)

运行结果:

array([[118, 143,  65,  60,  96, 180],
       [126, 148, 105,  84, 113,  68],
       [111,  91, 143, 107,  85, 119],
       [131,  81, 170, 137, 162, 137],
       [ 71,  77,  71, 177, 135, 182]])
array([[ 42, -13,  -1, -16,  12, -14],
       [ 40,  40, -27,  26, -83, -42],
       [-43,  33,  11,   9, -41,  35],
       [-21, -51, -10,  -5,  30,  35],
       [ 41,  19,   9, -15,  23,   6]])

②矩阵积np.dot()
第一个矩阵的列数=第二个矩阵的行数

n3 = np.random.randint(10,100,size=(6,6))
n3

运行结果:

array([[84, 30, 19, 15, 79, 43],
       [29, 64, 85, 83, 98, 54],
       [99, 38, 35, 84, 66, 74],
       [87, 56, 10, 87, 99, 65],
       [45, 86, 96, 41, 45, 66],
       [72, 54, 30, 60, 13, 14]])

eg

np.dot(n,n3)

运行结果:

array([[22093, 18134, 16059, 18391, 20489, 15474],
       [19955, 15060, 13312, 18503, 24632, 16278],
       [23857, 17212, 13613, 22692, 21577, 16808],
       [29229, 22246, 17576, 23628, 23067, 20925],
       [27426, 22678, 17758, 24110, 24564, 19755]])

矩阵操作
③线性代数中其他常用的矩阵操作

n = np.array([[1,2,3],[23,4,6],[1,3,5]])
# 矩阵的逆
np.linalg.inv(n)

运行结果:

array([[-9.52380952e-02,  4.76190476e-02,  7.72329061e-17],
       [ 5.19047619e+00, -9.52380952e-02, -3.00000000e+00],
       [-3.09523810e+00,  4.76190476e-02,  2.00000000e+00]])
)
# 矩阵的行列式,round()
np.round(np.linalg.det(n))

运行结果:

-21.0

# 矩阵的秩
np.linalg.matrix_rank(n)

运行结果:

3

12.广播机制

** ndarray广播机制的两条规则

规则一:为缺失的维度补维度
规则二:缺失元素用已有值填充
eg

n = np.ones((2,3),dtype=np.int8)
n1 = np.arange(1,4)
display(n,n1)

运行结果:

array([[1, 1, 1],
       [1, 1, 1]], dtype=int8)
array([1, 2, 3])

eg

n+n1

运行结果:

array([[2, 3, 4],
       [2, 3, 4]])

eg

a = np.arange(3).reshape((3, 1))
b = np.arange(3)
display(a,b)
array([[0],
       [1],
       [2]])
array([0, 1, 2])

eg

a + b
array([[0, 1, 2],
       [1, 2, 3],
       [2, 3, 4]])

其他常见数学操作

abs(绝对值)、sqrt(平方根)、square(平方)、exp(指数)、log(对数)、sin(正弦函数)、cos(余弦函数)、tan(正切)、round(四舍五入)、ceil(向上取整)、floor(向下取整)、cumsum(累加)

13.ndarray的排序

数组
快速排序
np.sort(数组)ndarray.sort()都可以,但有区别:
np.sort(数组)不改变原数组
ndarray.sort()本地处理,不占用空间,但改变原数组

n = np.random.randint(0,100,size=(3,4))
n

运行结果:

array([[33, 11, 55, 14],
       [57, 12, 75, 65],
       [63,  2, 33, 66]])

eg

np.sort(n)

运行结果:

array([[11, 14, 33, 55],
       [12, 57, 65, 75],
       [ 2, 33, 63, 66]])

eg

n
array([[33, 11, 55, 14],
       [57, 12, 75, 65],
       [63,  2, 33, 66]])

eg

n.sort()
n

运行结果:

array([[11, 14, 33, 55],
       [12, 57, 65, 75],
       [ 2, 33, 63, 66]])

14.ndarray文件操作

①保存数组
save : 保存ndarray到一个npy文件
savez : 将多个array保存到一个npz文件中
,xarr=x,yarr=y

x = np.arange(5)
y = np.arange(10,20)
# save:保存x.npy
np.save('x',x)
# savaz:
np.savez('arrs.npz',xarr=x,yarr=y)
# 读取npy文件
np.load('x.npy')

运行结果:

array([0, 1, 2, 3, 4])
# 读取npz文件
np.load('arrs.npz')

运行结果<numpy.lib.npyio.NpzFile at 0x21542317b38>

# 读取npz文件
np.load('arrs.npz')['xarr']

运行结果

array([0, 1, 2, 3, 4])

②csv、txt文件的读写操作

n = np.random.randint(0, 10, size=(5, 4))
n

运行结果

array([[7, 1, 9, 8],
       [1, 1, 4, 1],
       [6, 8, 8, 8],
       [8, 7, 1, 7],
       [2, 6, 5, 2]])

limiter=’ ’ :分割符
存到csv,txt
delimiter=’ ’ :分割符
eg

np.savetxt('arr.csv',n,delimiter=' ')
np.loadtxt('arr.csv',delimiter=" ",dtype=np.int16)

运行结果

array([[7, 1, 9, 8],
       [1, 1, 4, 1],
       [6, 8, 8, 8],
       [8, 7, 1, 7],
       [2, 6, 5, 2]], dtype=int16)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值