目录
3.3.5 创建随机数组 https://www.bilibili.com/video/BV1a7411d7fk?p=24
1、Numpy介绍
- Numpy用户快速处理任意维度的数组。
- Numpy支持长概念的数组和矩阵操作。
- Numpy使用ndarray对象来处理多维数组。
2、ndarray介绍
ndarray是一个N维数组类型,描述了相同类型的“iterms”的集合。
2.1ndarray和原生python效率对比
import numpy as np
import time
import random
a = []
for i in range(100000000):
a.append(random.random())
time_1 = time.time()
sum_list = sum(a)
time1 = time.time()-time_1
b = np.array(a)
time_2 = time.time()
sum_array = np.sum(b)
time2 = time.time()-time_2
print(time1)
print(time2)
运行结果:
C:\Users\Administrator\Anaconda3\python.exe D:/PycharmProjects/model_study/test.py
0.7210443019866943
0.16411638259887695
Process finished with exit code 0
可见,ndarray比python原生列表的运行效率高很多。
2.2 ndarray效率高的原因分析
2.2.1 ndarray的内存块风格
因此,ndarray存储的数据类型必须相同,而列表中存储的数据类型可以不同。
2.2.2 ndarray支持并行化运算(向量化运算)
numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动进行并行计算。
2.2.3 内部实现不同
Numpy底层使用C语言编写,内部除了GIL(全局解释器),其对数组的操作不受python解释器的限制,所以其效率远高于纯python代码。
3 ndarray的使用
3.1 ndarray数组的属性
属性名字 | 属性解释 |
ndarray.shape | 数组维度的元组 |
ndarray.ndim | 数组维数 |
ndarray.size | 数组中元素的数量 |
ndarray.itermsize | 一个数组元素的长度(字节) |
ndarray.dtype | 数组元素类型 |
3.2 数组的类型
序号 | 名称 | 描述 | 简写 |
1 | np.bool | 用一个字节存储的False布尔类型(True或False) | ‘b’ |
2 | np.int8 | 一个字节大小,-128到127 | 'i' |
3 | np.int16 | 整数,-32768到32767 | 'i2 |
4 | np.int32 | 整数,-2^31至2^32-1 | 'i4' |
5 | np.int64 | 整数,-2^63至2……63-1 | 'i8' |
6 | np.unit8 | 无符号整数,0至255 | 'u' |
7 | np.unit16 | 无符号整数,0至65535 | 'u2' |
8 | np.unit32 | 无符号整数,0至2^32-1 | 'u4' |
9 | np.unit64 | 无符号整数,0至2^64-1 | 'u8' |
10 | np.float16 | 半精度浮点数,16位,正负号1位,指数5位,精度10位 | 'f2' |
11 | np.float32 | 单精度浮点数,32位,正负号1位,指数8位,精度23位 | 'f4' |
12 | np.float64 | 双精度浮点数,64位,正负号1位,指数11位,精度52位 | 'f8' |
13 | np.complex64 | 复数,分别用两个32位浮点数表示实部和虚部 | 'c8' |
14 | np.complex128 | 复数,分别用两个64位浮点数表示实部和虚部 | 'c16' |
15 | np.object_ | python对象 | 'O' |
16 | np.string_ | 字符串 | 'S' |
17 | np.unicode_ | Unicode类型 | 'U' |
3.3 数组的生成方法
3.3.1 生成0和1数组
np.ones(shape,dtype)
np.ones_like(a.dtype)
np.zeros(shape,dtype)
np.zeros_like(a.dtype)
3.3.3 从现有数组生成
np.array(object,dtype) # (类似)深拷贝
np.asarray(a,dtype) # (类似)浅拷贝
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print('a:',a)
a1 = np.array(a)
print('a1:',a1)
a2 = np.asarray(a)
print('a2:',a2)
print('************************')
a[0,0] = 100
print('a:',a)
print('a1:',a1)
print('a2:',a2)
运行结果
C:\Users\Administrator\Anaconda3\python.exe D:/PycharmProjects/model_study/test.py
a: [[1 2 3]
[4 5 6]]
a1: [[1 2 3]
[4 5 6]]
a2: [[1 2 3]
[4 5 6]]
************************
a: [[100 2 3]
[ 4 5 6]]
a1: [[1 2 3]
[4 5 6]]
a2: [[100 2 3]
[ 4 5 6]]
Process finished with exit code 0
3.3.4 生成固定范围的数组
创建等差数组 -- 指定数量
np.linspace(start,stop,num,endpoint)
参数
- start:序列的起始值
- stop:序列的终止值
- num:要生成的等间隔样例数量,默认为50
- endpoint:序列中是否包含stop值,默认为true
创建等差数组 -- 指定步长
np.arange(start,stop,step,dtype)
参数
- step:步长,默认为1
创建等比数列
np.logspace(start,stop,num)
参数
- num:要生成的等比数列数量,默认为50
import numpy as np
a = np.logspace(0,2,3)
print(a)
输出结果
C:\Users\Administrator\Anaconda3\python.exe D:/PycharmProjects/model_study/test.py
[ 1. 10. 100.]
Process finished with exit code 0
3.3.5 创建随机数组 https://www.bilibili.com/video/BV1a7411d7fk?p=24
使用np.random模块
正态分布(用的更多)
np.random.normal()
均匀分布
np.random.uniform()
4 数组的基本操作
数组的索引和切片
4.1 形状修改
ndarray.reshape(shape,order)
- 返回一个具有相同数据域,但shape不一样的视图
- 行、列不进行互换
ndarray.resize(new_shape)
- 修改数组本身的形状,需要保持元素个数前后相同
- 行、列不进行互换
ndarray.T
- 数组的转置
- 将数组的行列进行互换
4.2 类型修改
ndarray.astype(type)
返回修改了类型之后的数组
ndarray.tostring([order])或者ndarray.tobytes([order])
构造包含数组中原始数据字节的python字节
4.3 数组的去重
np.unique(array)
去除数组中的重复元素,并进行排序后输出(返回的都是一个一维数组?)
5 数组计算
5.1 逻辑运算
5.2 通用判断函数
- np.any()
- 判断一个tuple或者list是False否全部为空(0,False),如果全为空则返回False,如果不全为空,则返回True
- np.all()
- 判断一个tuple或者list是否全部不为空(1,True),如果全部不为空则返回Ttue,否则返回False。
5.3 np.where(三元运算符)
- np.where(np.logical_or(a,b),符合条件的结果,不符合条件的结果)
- np.where(条件,符合条件的结果,不符合条件的结果)
- np.where(np.logical_and(a,b),符合条件的结果,不符合条件的结果)
5.4 统计运算
统计指标 | 指标释义 |
min(a,sxis) | 返回数组的最小值或某行/某列上的最小值 |
max(a,sxis) | 返回数组的最大值或某个轴上的最大值 |
median(a,sxis) | 计算沿指定轴上的中位数 |
mean(a,sxis,dtype) | 计算沿指定轴上的算术平均值 |
std(a,sxis,dtype) | 计算沿指定轴的标准偏差 |
var(a,sxis,dtype) | 计算沿指定轴的方差 |
对于axis不怎么友好,0/1有时候是行,有时候是列,用的时候试试到底是行还是列。
- np.argmin(array,axis=0/1) # 求取行或列上的最小值对应的坐标
- np.argmax(array,axis=0/1) # 求取行或列上的最大值对应的坐标
6 数组间的运算
6.1 数组与数之间的运算
- 对数组中的每个元素进行相应的计算
注意:区分列表与数的计算
a = [1,2,3]
b = a * 3
print(a,'\n',b)
运行结果
C:\Users\Administrator\Anaconda3\python.exe D:/PycharmProjects/model_study/test.py
[1, 2, 3]
[1, 2, 3, 1, 2, 3, 1, 2, 3]
Process finished with exit code 0
6.2 数组与数组之间的运算
arr1 = np.array([[1,2,3,2,1,4],[5,6,1,2,3,4]])
arr2 = np.array([[1,2,3,4],[5,6,3,4]])
注意:arr1与arr2之间不能进行数组间运算 -- 广播机制
6.3 数组间运算的广播机制
广播机制就是数组之间运算需要满足的要求:数组在进行矢量化运算时,要求数组的形状是相等的。
import numpy as np
arr1 = np.array([[0],[1],[2],[3]])
print(arr1.shape)
arr2 = np.array([1,2,3])
print(arr2.shape)
print(arr1+arr2)
运行结果
C:\Users\Administrator\Anaconda3\python.exe D:/PycharmProjects/model_study/test.py
(4, 1)
(3,)
[[1 2 3]
[2 3 4]
[3 4 5]
[4 5 6]]
Process finished with exit code 0
上述代码中,数组arr1是4行1列,arr2是1行3列,这两个数组要进行相加,按照广播机制会对数组arr1和arr2都进行扩展,使得数组arr1和arr2都变成4行3列。
广播机制扩展数组的过程图:
广播机制实现了对两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只要满足如下任意一个条件即可:
- 数组的某一维度等长;
- 其中一个数组的某一维度为1。