1.Numpy介绍
Numpy全称为numberical python。
2.ndarray介绍
ndarray全称N-dimensional array,一个N维数组类型,相同类型元素的集合。ndarray比python中的原生列表运算效率高。
- 因为ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一个元素。
- numpy内置了并行运算功能
import numpy as np
# 如果ndarray数组中的元素类型不一致,则转为string类型
arr = np.array([[123, "str"],[True, "hi"]])
# [['123' 'str']
# ['True' 'hi']]
print(arr)
3.ndarray的属性
- ndarray.shape:表示数组维度的元组
- ndarray.ndim:数组维数
- ndarray.size:数组中的元素数量
- ndarray.itemsize: 一个数组元素的长度(字节)
- ndarray.dtype:数组元素的类型
4.ndarray的数据类型
# 创建数组的时候指定数据类型
arr = np.array([[1,2,3],[4,5,6]], dtype=np.string_)
print(arr)
print(arr.dtype)#|S1
# 若不指定,整数默认int32,小数默认float64
5.ndarray的基本操作
- 生成0和1的数组
# 生成1的数组
np.ones(shape, dtype)
np.ones_like(a, dtype)
# 生成0的数组
np.zeros(shape, dtype)
# 参数a表示从哪个数组生成
np.zeros_like(a, dtype)
arr = np.ones([2,3])
# [[1. 1. 1.]
# [1. 1. 1.]]
print(arr)
arr = np.zeros_like(arr)
#[[0. 0. 0.]
# [0. 0. 0.]]
print(arr)
- 从现有数组中生成数组
- np.array(object, dtype)
- np.asarray(a, dtype)
arr1 = np.array([[1,2,3],[4,5,6]])
# 深拷贝
arr2 = np.array(arr1)
# 浅拷贝
arr3 = np.asarray(arr1)
- 生成固定范围的数组
- 创建等差数组,可以指定数量:np.linspace(start, stop, num, endpoint)
- start:序列的起始值
- stop:序列的终止值(不包括)
- num:要生成的等间隔样例数量,默认为50
- endpoint:序列中是否包含stop值,默认为ture
arr = np.linspace(0,100,10,False) # [ 0. 10. 20. 30. 40. 50. 60. 70. 80. 90.] print(arr)
- 创建等差数组,可以指定步长:np.arange(start,stop, step, dtype)
- step:步长默认为1
arr = np.arange(0, 100, 30 ) # [ 0 30 60 90] print(arr)
- 创建等比数列:np.logspace(start,stop, num)
- num:要生成的等比数列数量,默认为50
arr = np.logspace(0, 2, 3) # [ 1. 10. 100.] print(arr)
- 创建等差数组,可以指定数量:np.linspace(start, stop, num, endpoint)
- 生成随机数组:使用np.random模块
- 正态分布的创建方式:
- np.random.randn(d0,d1,...,dn):从标准正态分布中返回一个或者多个样本值
- np.random.normal(loc=0.0, scale=1.0, size=None)
- loc:此概率分布的均值
- scale:此概率分布的标准差
- size:输出的shape,默认为None,只输出一个值。
// 创建一个包含10个数据的均值为1.75,标准差为1的数组 import numpy as np arr = np.random.normal(1.75, 1, 10) print(arr)
- np.random.standard_normal(size=None):返回指定形状的标准正态分布的数组。
- 示例:随机生成4支股票1周的交易日涨幅数据
// 涨跌幅在某个正态分布内,比如均值0,方差1 arr = np.random.normal(0, 1, (4,5))
- 均匀分布
- np.random.rand(d0, d1, ..., dn):返回[0.0,1.0)内的一组均匀分布的数。
- np.random.uniform(low=0.0, high=1.0, size=None):从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.
- low:采样下界,float类型,默认值为0;
- high: 采样上界,float类型,默认值为1;
- size: 输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出m * n * k个样本,缺省时输出1个值。
np.random.uniform(0, 100, size=(2,3)) // array([[43.82112267, 7.37574185,44.33969076], // [44.68005159, 99.35521923, 29.22186739]])
- np.random.randint(low, high=None, size=None, dtype='l'):从一个均匀分布中随机采样,生成一个整数或N维整数数组,取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数。
import numpy as np np.random.randint(0, 100, size=10) // array([66, 26, 94, 15, 6, 81, 14, 85, 94, 78]) np.random.randint(0, 100, size=(2,3)) // array([[12, 24, 49], // [17, 60, 68]])
- 正态分布的创建方式:
5.数组的索引和切片
- 二维数组的切片:先进行行索引,再进行列索引
// 测试数据如上图所示
// 获取前两行,前四列的数据
print(arr[0:2, 0:4])
- 三维数组的切片
// 测试数据如上图所示
print(arr[0, 0, 1]) // 2
print(arr[1,0,2]) // 9
6.形状的修改
- ndarray.reshape(shape, order):返回一个具有相同数据域,但是形状不一样的视图。(行和列不进行互换)
- ndarray.resize(new_shape):将会修改数组本身的形状,前提保持元素个数相同。(行和列不进行互换)
- ndarray.T:数组的转置,将数组的行和列进行转置。
7.类型修改
- ndarray.astype(type):返回修改了类型之后的数组
- ndarray.tostring([order])或者ndarray.tobytes([order]):转换成字节
8.数组的去重
- np.unique()
6.ndarray基本运算
1.逻辑运算
import numpy as np
arr = np.random.randint(40, 100, (3, 5))
print(arr)
#逻辑判断,如果元素大于60就标记为True,否则为False
print(arr > 60)
#将满足条件的元素设置为指定的值
arr[arr >= 60] = 1
print(arr)
2.通用判断函数
- np.all()
- np.any()
import numpy as np
# 三名同学五门成绩
arr = np.random.randint(40, 100, (3, 5))
print(arr)
# 判断前两名同学的成绩是否全大于80分的
res = np.all(arr[0:2,:] > 80)
print(res) #False
# 判断前两名同学的成绩是否有大于90分的
res = np.any(arr[0:2,:] > 90)
print(res) #True
3.函数np.where(三元运算符)
# 1.判断前四名同学前四门课程中,成绩中大于60的置为1,否则为0
# 五名同学五门成绩
score = np.random.randint(40, 100, (5, 5))
print(score)
temp = score[0:4, 0:4]
np.where(temp > 60, 1, 0)
4.np.logical_and(三元运算符)
5.np.logical_or(三元运算符)
# 1.判断前四名学生,前四门课程中,
#成绩中大于60且小于90的换为1,否则为0
# 五名同学五门成绩
score = np.random.randint(40, 100, (5, 5))
print(score)
temp = score[0:4, 0:4]
np.where(np.logical_and(temp > 60, temp < 90), 1, 0)
# 2.判断前四名学生,前四门课程中,
#成绩中大于90或小于60的换为1,否则为0
np.where(np.logical_or(temp > 90, temp < 60), 1, 0)
6.统计运算
- 统计指标
min(a, axis)
Return the minimum of an array or minimum along an axis.
max(a, axis])
Return the maximum of an array or maximum along an axis.
# 中位数
median(a, axis)
Compute the median along the specified axis.
# 平均值
mean(a, axis, dtype)
Compute the arithmetic mean along the specified axis.
# 标准差
std(a, axis, dtype)
Compute the standard deviation along the specified axis.
# 方差
var(a, axis, dtype)
Compute the variance along the specified axis.
- 示例
# axis取0代表列, axis取1代表行去进行统计
# 六名同学五门成绩
score = np.random.randint(40, 100, (6, 5))
print(score)
print("各科成绩的最大分:{}".format(np.max(score, axis=1)))
print("各科成绩的最小分:{}".format(np.min(score, axis=1)))
print("各科成绩的波动情况:{}".format(np.std(score, axis=1)))
print("各科成绩的平均分:{}".format(np.mean(score, axis=1)))
print("各科成绩最高分对应的学生下标:{}".format(np.argmax(score, axis=0)))
7.数组间的运算
- 数组与数之间的运算
- 数组与数组的运算
- 数组的广播机制:数组在进行矢量化运算时,要求数组的形状相等。当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样,就可以进行矢量化运算了。
- 数组广播机制的条件:维度相等或者shape对应位置为1
- 示例
7.矩阵
1.numpy中创建矩阵
- 使用array函数
a = np.array([[1,2,3],[4,5,6]])
print(type(a)) #<class 'numpy.ndarray'>
- 使用matrix函数
b = np.matrix([[1,0,0],[0,1,0]])
print(type(b)) #<class 'numpy.matrix'>
2.矩阵乘法API
- np.matmul():函数名为matrix multiplication的缩写
- np.dot()
12的区别:二者都是矩阵乘法。np.matmul中禁止矩阵与标量的乘法。在矢量乘矢量的內积运算中,np.matmul与np.dot没有区别。
3.矩阵扁平化
扁平化就是将矩阵转换为一维numpy数组。
4.方阵的特征值和特征向量
使用numpy库的linalg包的eig函数
5.方阵的逆矩阵
使用numpy库的linalg包的inv函数
6.方阵的行列式
使用numpy库的linalg包的det函数
7.方阵的迹
使用ndarray对象的trace()方法
8.矩阵的转置
- 使用transpose函数或者方法
- T属性