1 ndarray
相比于python中的list,ndarray的核心优势就是运算快
Numpy
喜欢用电脑内存中连续的一块物理地址存储数据
Python
的 List
并不是连续存储的,它的数据是分散在不同的物理空间(list中的类型可以是不一样的)
1.1 创建
np.array(object,dtype=…)
用object创建ndarray
empty(shape,dtype=)
empty_like(data)
指定形状&类型,元素值均为随机值
zeros(shape,dtype=)
zeros_like(data)
填充0
ones
ones_like(data)
填充1
full(shape,num,dtype)
full_like(data,num)
用num填充shape大小的数组
eye(num,dtype)
等同于identity(num,dtype)
num*num的单位矩阵
random.random(shape,dtype)
numpy.random.normal(loc,scale,size)
正态分布
loc(float)正态分布的均值scale(float)正态分布的标准差size(int 或者整数元组)输出的值赋在shape里,默认为None
diag
当 np.diag(array)中
array是一个 1维数组时,结果形成一个以一维数组为对角线元素的矩阵
array是一个 二维矩阵时,结果输出矩阵的对角线元素
diag 函数在array后面还可以跟一个参数k,正值表示在对角线上方第几条对角线,负值表示在对角线下方第几条对角线
empty_like(x)
创建一个形状和x一样的,数值随机
arange (start ,stop ,step ,dtype )
linspace
创建一个等差数列
logspace
创建一个等比数列
1.2 ndarray 属性
ndim
矩阵维数
shape
数组的维度(元组形式)【用reshape调整大小】
itemsize
一个元素的大小(占几个字节)
real
元素的实部
imag
元素的虚部
dtype
数据类型
size
元素个数
1.3 切片
a[start:end:step]
左闭右开
a[…,x]——第x+1列
a[x,…]——第x+1行
a[[list1],[list2]]
获取
(list1[0].list2[0])
(list1[1].list2[1])
(list1[2].list2[2])
….等索引位置的数据
a[list]
获取list中这几行元素
a[np.ix_([list1],[list2])]
获取第list1行的第list2列的数据
1.3.1 切片的性质
切片是原来的array的一个视图,修改切片的话,原来的也改变了
!!!记住结论:!!!
- 如果是数字/带数字的’:’来切片的话,不论是不是有塌缩(类似于r1那样的变成一维的)都是原来的的一个view,元素修改了就一起修改了(a[0,:],a[0:1,:])
如果是数组这样的索引切片的话(注:元组tuple不行),那么就是copy不是view了(a[[0],:])
a[List]相当于np.array(a[x] for x in List)
如果是混合的(一个数组,一个纯数字),那么就是copy(因为有数组切片了)’
举一个不太严谨的比方,a[List,a:b]=np.array(a[x] for x in List)[:,a:b]。因为其中有copy的部分,所以就不是view
import numpy as np
a=np.array([[1,2,3],[3,4,5],[7,8,9]])
b=a[1,:]
c=a[[1],:]
d=a[1:2,:]
print(a,'\n',b,c,d)
'''
[[1 2 3]
[3 4 5]
[7 8 9]]
[3 4 5] [[3 4 5]] [[3 4 5]]
'''
b[1]=10
print(a,'\n',b,c,d)
'''
[[ 1 2 3]
[ 3 10 5]
[ 7 8 9]]
[ 3 10 5] [[3 4 5]] [[ 3 10 5]]
'''
1.4 布尔索引
2 数组运算
执行数组的运算必须有相同的行列/符合广播规则
2.1 相同行列
相同行列:对应元素加减乘除
2.2 广播原则
当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制
2.2.1 数组+标量
2.2.2 数组+行/列
3 内积外积与矩阵乘法
3.1 外积
3.2 内积
内积——inner/dot
np.dot(a,b)等价于a.dot(b)
inner用法和dot稍有不同: np.dot(a, b)= np.inner(a, b.T),相当于b做一次转置
3.3 乘法
matmul/@/dot
3.4 dot用法总结
- 对于np.dot(a,b,out=None)
- 如果a,b是一维数组,那么相当于两个向量的点积
- 如果a,b是二维数组(矩阵),那么就相当于a和b的矩阵乘法(等价于matmul,@)
- 如果a,b有一个是标量,那么就相当于逐元素乘I等价于multiply,*)
- 如果a是N维数组,b是M维数组,那么结果是沿着a的最后一个轴,和b的乘积和
3.5 叉乘
np.cross((0,0,1),(3,0,0))
#array([0, 3, 0])
4 函数
all
矩阵中元素是否全部非零
any
矩阵中是否有元素非零
argmax/argmin
第几维度的最大最小值的坐标
Argmax[0]:对每一个a[…][0][0],a[…][0][1],a[…][0][2]
a[…][1][0],a[…][1][1],a[…][1][2]找一个最大值
nanargmax/nanargmin
和argmax/argmin 类似,只是在这里,所有的nan都被排除掉了
count_nonzero()
统计非零元素值
clip
clip(ndarray,a,b),比a小的赋值a,比b大的赋值b
floor
向下取整
ceil
向上取整
prod
所有元素乘积结果
argsort
argsort函数返回的是数组值从小到大的索引值
b
1
3
5
2
6
7
4
3
序号
0
1
2
3
4
5
6
7
b——正序
-b——倒序
如果是多维的话(默认是最大的一个axis)
Axis=0
a[..][0][0],a[…][0][1],a[…][0][2]
a[..][1][0],a[…][1][1],a[…][1][2]
Axis=1
a[0][…][0],a[0][…][1],a[0][…][2]
Axis=2同理
copy
这个是真copy,不是view
nanmax
nanmin
nanmean
nanmedian
nanstd
nanvar
功能类似,只是这里不考虑nan
clip
截取数组中在min和max之间的部分,比min小的置为min,比max大的置为max
cumsum/cumprod
括号是几——第几维度累加/累乘(a[][][][]里面的第几个,从左往右)
括号里是0:原第一行=原第一行
原第二行=原第二行+原第一行
原第三行=原第三行+原第二行+原第一行
括号里是1:列的操作
没有字母,所有元素,一个一个叠加
diff
类差运算
flatten
返回一份数据拷贝,对拷贝所做的修改不影响原始数组
F风格:按列展开
flat 一个迭代器
np.isin(a,b)
用于判定a中的元素在b中是否出现过,如果出现过返回True,否则返回False,最终结果为一个形状和a一模一样的数组。
和np.where搭配使用,效果更好(np.where返回True的坐标)
分别是我找到的1的第一维坐标和第二位坐标
nditer
按照ndarray在内存中的存储顺序逐个访问
a和a转置在内存中的存储顺序一样——他们的遍历顺序一样
默认order=’C’行优先
——order=”F’(fortran 列优先)
meshgrid(ndarray,ndarray)
返回坐标方格的X与Y
x和y都是二维数组,分别是这些点的横坐标/纵坐标
计算平均数,加axis就是某一个轴,
比如axis=0,就是每一列一个平均数(a[;;;][0],a[,,,,][1],…..,)
average只能是np.average
hypot
输入为一个2*N的nadarray
输出N,为每一列元素作为直角边,斜边的长度
median
中位数
std
标准差
newaxis
添加一个维度
感觉还是reshape靠谱一点
ravel
和flatten差不多,唯一的区别是,修改会影响原始数组
reshape
resize
如果一样大的话和a.reshape()差不多
shape比a的尺寸小的话,那就是截取
如果尺寸大的话,会把a的元素按照a的顺序补进去
np.round
round( number ) 函数会返回浮点数 number 的四舍五入值
具体定义为 round(number[,digits]):
如果 digits>0 ,四舍五入到指定的小数位;
如果 digits=0 ,四舍五入到最接近的整数;
如果 digits
Original: https://blog.csdn.net/qq_40206371/article/details/120423547
Author: UQI-LIUWJ
Title: python包介绍:numpy
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/763208/
转载文章受原作者版权保护。转载请注明原作者出处!