Numpy库基本使用

N u m p y 库 基 本 使 用 Numpy库基本使用 Numpy使

1 为什么要用Numpy

1.1  低效的Python for循环

【例】 求100万个数的倒数

def compute_reciprocals(values):
    res = []
    for value in values:      # 每遍历到一个元素,就要判断其类型,并查找适用于该数据类型的正确函数
        res.append(1/value)
    return res


values = list(range(1, 1000000))
%timeit compute_reciprocals(values)

在这里插入图片描述

%timeit :ipython中统计运行时间的魔术方法(多次运行取平均值)

import numpy as np

values = np.arange(1, 1000000)
%timeit 1/values

在这里插入图片描述

实现相同计算,Numpy的运行速度是Python循环的25倍,产生了质的飞跃

1.2  Numpy为什么如此高效

Numpy 是由C语言编写的

1、编译型语言VS解释型语言

C语言执行时,对代码进行整体编译,速度更快

2、连续单一类型存储VS分散多变类型存储

(1)Numpy数组内的数据类型必须是统一的,如全部是浮点型,而Python列表支持任意类型数据的填充

(2)Numpy数组内的数据连续存储在内存中,而Python列表的数据分散在内存中

这种存储结构,与一些更加高效的底层处理方式更加的契合

3、多线程VS线程锁

Python语言执行时有线程锁,无法实现真正的多线程并行,而C语言可以

1.3  什么时候用Numpy

在数据处理的过程中,遇到使用“Python for循环” 实现一些向量化、矩阵化操作的时候,要优先考虑用Numpy

如: 1、两个向量的点乘

   2、矩阵乘法

2 Numpy数组的创建

2.1 从列表开始创建

import numpy as np

x = np.array([1, 2, 3, 4, 5])
print(x)

在这里插入图片描述

print(type(x))
print(x.shape)

在这里插入图片描述

  • 设置数组的数据类型
x = np.array([1, 2, 3, 4, 5], dtype="float32")
print(x)
print(type(x[0]))

在这里插入图片描述

  • 二维数组
x = np.array([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])
print(x)
print(x.shape)

在这里插入图片描述

2.2 从头创建数组

.
(1)创建长度为5的数组,值都为0

np.zeros(5, dtype=int)

在这里插入图片描述
(2)创建一个2*4的浮点型数组,值都为1

np.ones((2, 4), dtype=float)

在这里插入图片描述

(3)创建一个3*5的数组,值都为8.8

np.full((3, 5), 8.8)

在这里插入图片描述

(4)创建一个3*3的单位矩阵

np.eye(3)

在这里插入图片描述

(5)创建一个线性序列数组,从1开始,到15结束,步长为2

np.arange(1, 15, 2)

在这里插入图片描述

(6)创建一个4个元素的数组,这四个数均匀的分配到0~1

np.linspace(0, 1, 4)

在这里插入图片描述
(7)创建一个10个元素的数组,形成1~10^9的等比数列

np.logspace(0, 9, 10)

在这里插入图片描述

(8)创建一个3*3的,在0~1之间均匀分布的随机数构成的数组

np.random.random((3,3))

在这里插入图片描述

(9)创建一个3*3的,均值为0,标准差为1的正态分布随机数构成的数组

np.random.normal(0, 1, (3,3))

在这里插入图片描述

(10)创建一个3*3的,在[0,10)之间随机整数构成的数组

np.random.randint(0, 10, (3,3))

在这里插入图片描述

(11)随机重排列

x = np.array([10, 20, 30, 40])
np.random.permutation(x)       # 生产新列表

在这里插入图片描述

print(x)
np.random.shuffle(x)          # 修改原列表
print(x)

在这里插入图片描述

(12)随机采样

  • 按指定形状采样
x = np.arange(10, 25, dtype = float)
x

在这里插入图片描述

np.random.choice(x, size=(4, 3))

在这里插入图片描述

import numpy as np
np.random.choice(10, 10)

在这里插入图片描述

x = np.arange(5).reshape(1, 5)
x
x.sum(axis=1, keepdims=True)

在这里插入图片描述

  • 按概率采样
np.random.choice(x, size=(4, 3), p=x/np.sum(x))

在这里插入图片描述

3 Numpy数组的性质

3.1 数组的属性

x = np.random.randint(10, size=(3, 4))
x

在这里插入图片描述

1、数组的形状shape

x.shape

在这里插入图片描述
2、数组的维度ndim

x.ndim

在这里插入图片描述

y = np.arange(10)
y

在这里插入图片描述

y.ndim

在这里插入图片描述

3、数组的大小size

x.size

在这里插入图片描述

4、数组的数据类型dtype

x.dtype

在这里插入图片描述

3.2 数组索引

1、一维数组的索引

x1 = np.arange(10)
x1

在这里插入图片描述

x1[0]

在这里插入图片描述

x1[5]

在这里插入图片描述

x1[-1]

在这里插入图片描述

2、多维数组的索引——以二维为例

x2 = np.random.randint(0, 20, (2,3))
x2

在这里插入图片描述

x2[0, 0]

在这里插入图片描述

x2[0][0]

在这里插入图片描述

注意:numpy数组的数据类型是固定的,向一个整型数组插入一个浮点值,浮点值会向下进行取整

x2[0, 0] = 1.618
x2

在这里插入图片描述

3.3 数组的切片

1、一维数组——跟列表一样

x1 = np.arange(10)
x1

在这里插入图片描述

x1[:3]

在这里插入图片描述

x1[3:]

在这里插入图片描述

x1[::-1]

在这里插入图片描述
2、多维数组——以二维为例

x2 = np.random.randint(20, size=(3,4)) 
x2

在这里插入图片描述

x2[:2, :3]             # 前两行,前三列

在这里插入图片描述

x2[:2, 0:3:2]       # 前两行 前三列(每隔一列)

在这里插入图片描述

x2[::-1, ::-1]

在这里插入图片描述

3、获取数组的行和列

x3 = np.random.randint(20, size=(3,4)) 
x3

在这里插入图片描述

x3[1, :]   #第一行  从0开始计数

在这里插入图片描述

x3[1]    # 第一行简写

在这里插入图片描述

x3[:, 2]  # 第二列   从0开始计数

在这里插入图片描述

4、切片获取的是视图,而非副本

x4 = np.random.randint(20, size=(3,4)) 
x4

在这里插入图片描述

x5 = x4[:2, :2]
x5

在这里插入图片描述
注意:视图元素发生修改,则原数组亦发生相应修改

x5[0, 0] = 0
x5

在这里插入图片描述

x4

在这里插入图片描述

修改切片的安全方式:copy

x4 = np.random.randint(20, size=(3,4)) 
x4

在这里插入图片描述

x6 = x4[:2, :2].copy()
x6

在这里插入图片描述

x6[0, 0] = 0
x6

在这里插入图片描述

x4

在这里插入图片描述

3.4 数组的变形

x5 = np.random.randint(0, 10, (12,))
x5

在这里插入图片描述

x5.shape

在这里插入图片描述

x6 = x5.reshape(3, 4)
x6

在这里插入图片描述

注意:reshape返回的是视图,而非副本

x6[0, 0] = 0
x5

在这里插入图片描述

一维向量转行向量

x7 = x5.reshape(1, x5.shape[0])    
x7

在这里插入图片描述

x8 = x5[np.newaxis, :]
x8

在这里插入图片描述
一维向量转列向量

x7 = x5.reshape(x5.shape[0], 1)    
x7

在这里插入图片描述

x8 = x5[:, np.newaxis]
x8

在这里插入图片描述

多维向量转一维向量

x6 = np.random.randint(0, 10, (3, 4))
x6

在这里插入图片描述

flatten返回的是副本

x9 = x6.flatten()
x9

在这里插入图片描述

x9[0]=0
x6

在这里插入图片描述

ravel返回的是视图

x10 = x6.ravel()
x10

在这里插入图片描述

x10[0]=0
x6

在这里插入图片描述

reshape返回的是视图

x11 = x6.reshape(-1)
x11

在这里插入图片描述

x11[0]=10
x6

在这里插入图片描述

3.5 数组的拼接

x1 = np.array([[1, 2, 3],
              [4, 5, 6]])
x2 = np.array([[7, 8, 9],
              [0, 1, 2]])

1、水平拼接——非视图

x3 = np.hstack([x1, x2])
x3

在这里插入图片描述

x3[0][0] = 0
x1

在这里插入图片描述

x4 = np.c_[x1, x2]
x4

在这里插入图片描述

x4[0][0] = 0
x1

在这里插入图片描述

2、垂直拼接——非视图

x1 = np.array([[1, 2, 3],
              [4, 5, 6]])
x2 = np.array([[7, 8, 9],
              [0, 1, 2]])
x5 = np.vstack([x1, x2])
x5

在这里插入图片描述

x6 = np.r_[x1, x2]
x6

在这里插入图片描述

3.6 数组的分裂

1、split的用法

x6 = np.arange(10)
x6

在这里插入图片描述

x1, x2, x3 = np.split(x6, [2, 7])
print(x1, x2, x3)

在这里插入图片描述

2、hsplit的用法

x7 = np.arange(1, 26).reshape(5, 5)
x7

在这里插入图片描述

left, middle, right = np.hsplit(x7, [2,4])
print("left:\n", left)            # 第0~1列
print("middle:\n", middle)        # 第2~3列
print("right:\n", right)          # 第4列

在这里插入图片描述

3、vsplit的用法

x7 = np.arange(1, 26).reshape(5, 5)
x7

在这里插入图片描述

upper, middle, lower = np.vsplit(x7, [2,4])
print("upper:\n", upper)         # 第0~1行
print("middle:\n", middle)       # 第2~3行
print("lower:\n", lower)         # 第4行

在这里插入图片描述

4 Numpy四大运算

1、与数字的加减乘除等

x1 = np.arange(1,6)
x1

在这里插入图片描述

print("x1+5", x1+5)
print("x1-5", x1-5)
print("x1*5", x1*5)
print("x1/5", x1/5)

在这里插入图片描述

print("-x1", -x1)
print("x1**2", x1**2)
print("x1//2", x1//2)
print("x1%2", x1%2)

在这里插入图片描述
2、绝对值、三角函数、指数、对数

(1)绝对值

x2 = np.array([1, -1, 2, -2, 0])
x2

在这里插入图片描述

abs(x2)

在这里插入图片描述

np.abs(x2)

在这里插入图片描述
(2)三角函数

theta = np.linspace(0, np.pi, 3)
theta

在这里插入图片描述

print("sin(theta)", np.sin(theta))
print("con(theta)", np.cos(theta))
print("tan(theta)", np.tan(theta))

在这里插入图片描述

x = [1, 0 ,-1]
print("arcsin(x)", np.arcsin(x))
print("arccon(x)", np.arccos(x))
print("arctan(x)", np.arctan(x))

在这里插入图片描述
(3)指数运算

x = np.arange(3)
x

在这里插入图片描述

np.exp(x)

在这里插入图片描述

(4)对数运算

x = np.array([1, 2, 4, 8 ,10])
print("ln(x)", np.log(x))
print("log2(x)", np.log2(x))
print("log10(x)", np.log10(x))

在这里插入图片描述
3、两个数组的运算

x1 = np.arange(1,6)
x1

在这里插入图片描述

x2 = np.arange(6,11)
x2

在这里插入图片描述

print("x1+x2:", x1+x2)
print("x1-x2:", x1-x2)
print("x1*x2:", x1*x2)
print("x1/x2:", x1/x2)

在这里插入图片描述

4.2 矩阵运算

x = np.arange(9).reshape(3, 3)
x

在这里插入图片描述

  • 矩阵的转置
y = x.T
y

在这里插入图片描述

  • 矩阵乘法
x = np.array([[1, 0],
             [1, 1]])
y = np.array([[0, 1],
             [1, 1]])
x.dot(y)

在这里插入图片描述

np.dot(x, y)

在这里插入图片描述

y.dot(x)

在这里插入图片描述

np.dot(y, x)

在这里插入图片描述

注意跟x*y的区别

x*y

在这里插入图片描述

4.3 广播运算

x = np.arange(3).reshape(1, 3)
x

在这里插入图片描述

x+5

在这里插入图片描述
规则

如果两个数组的形状在维度上不匹配

那么数组的形式会沿着维度为1的维度进行扩展以匹配另一个数组的形状。

x1 = np.ones((3,3))
x1

在这里插入图片描述

x2 = np.arange(3).reshape(1, 3)
x2

在这里插入图片描述

x1+x2

在这里插入图片描述

x3 = np.logspace(1, 10, 10, base=2).reshape(2, 5)
x3

在这里插入图片描述

x4 = np.array([[1, 2, 4, 8, 16]])
x4

在这里插入图片描述

x3/x4

在这里插入图片描述

x5 = np.arange(3).reshape(3, 1)
x5

在这里插入图片描述

x6 = np.arange(3).reshape(1, 3)
x6

在这里插入图片描述

x5+x6

在这里插入图片描述

4.4 比较运算和掩码

1、比较运算

x1 = np.random.randint(100, size=(10,10))
x1

在这里插入图片描述

x1 > 50

在这里插入图片描述

2、操作布尔数组

x2 = np.random.randint(10, size=(3, 4))
x2

在这里插入图片描述

print(x2 > 5)
np.sum(x2 > 5)

在这里插入图片描述

np.all(x2 > 0)

在这里插入图片描述

np.any(x2 == 6)

在这里插入图片描述

np.all(x2 < 9, axis=1)   # 按行进行判断

在这里插入图片描述

x2

在这里插入图片描述

(x2 < 9) & (x2 >5)

在这里插入图片描述

np.sum((x2 < 9) & (x2 >5))

在这里插入图片描述

3、将布尔数组作为掩码

x2

在这里插入图片描述

x2 > 5

在这里插入图片描述

x2[x2 > 5]

在这里插入图片描述

4.5 花哨的索引

1、一维数组

x = np.random.randint(100, size=10)
x

在这里插入图片描述
注意:结果的形状与索引数组ind一致

ind = [2, 6, 9]
x[ind]

在这里插入图片描述

ind = np.array([[1, 0],
               [2, 3]])
x[ind]

在这里插入图片描述

2、多维数组

x = np.arange(12).reshape(3, 4)
x

在这里插入图片描述

row = np.array([0, 1, 2])
col = np.array([1, 3, 0])
x[row, col]               # x(0, 1) x(1, 3) x(2, 0)

在这里插入图片描述

row[:, np.newaxis]       # 列向量

在这里插入图片描述

x[row[:, np.newaxis], col]    # 广播机制

在这里插入图片描述

5 其他Numpy通用函数

5.1 数值排序

x = np.random.randint(20, 50, size=10)
x

在这里插入图片描述

  • 产生新的排序数组
np.sort(x)

在这里插入图片描述

x

在这里插入图片描述

  • 替换原数组
x.sort()
x

在这里插入图片描述

  • 获得排序索引
x = np.random.randint(20, 50, size=10)
x

在这里插入图片描述

i = np.argsort(x)
i

在这里插入图片描述

5.2 最大最小值

x = np.random.randint(20, 50, size=10)
x

在这里插入图片描述

print("max:", np.max(x))
print("min:", np.min(x))

在这里插入图片描述

print("max_index:", np.argmax(x))
print("min_index:", np.argmin(x))

在这里插入图片描述

5.3 数值求和、求积

x = np.arange(1,6)
x

在这里插入图片描述

x.sum()

在这里插入图片描述

np.sum(x)

在这里插入图片描述

x1 = np.arange(6).reshape(2,3)
x1

在这里插入图片描述

  • 按行求和
np.sum(x1, axis=1)

在这里插入图片描述

  • 按列求和
np.sum(x1, axis=0)

在这里插入图片描述

  • 全体求和
np.sum(x1)

在这里插入图片描述

  • 求积
x

在这里插入图片描述

x.prod()

在这里插入图片描述

np.prod(x)

在这里插入图片描述

5.4 中位数、均值、方差、标准差

x = np.random.normal(0, 1, size=10000)
import matplotlib.pyplot as plt

plt.hist(x, bins=50)
plt.show()

在这里插入图片描述

  • 中位数
np.median(x)

在这里插入图片描述

  • 均值
x.mean()

在这里插入图片描述

np.mean(x)

在这里插入图片描述

  • 方差
x.var()

在这里插入图片描述

np.var(x)

在这里插入图片描述

  • 标准差
x.std()

在这里插入图片描述

np.std(x)

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值