python包介绍:numpy

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都是二维数组,分别是这些点的横坐标/纵坐标

mean/average

计算平均数,加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<0 ,则在小数点左侧进行四舍五入;

如果 round() 函数只有 number 这个参数,则等同于 digits=0。

split

等量对分

(axis=0 a[1~n][0]会被等分到各个里面去)

一定是等量,不等量的话会报错

vsplit=split(axis=0)

hsplit=split(axis=1)

array_split

不等量分割

np.sin

逐元素取sin

astype

转换类型

intersect1d

std

计算标准差

Axis=0——计算a[…][0][0],a[…][0][1],…的标准差

squeeze

删除单维度条目

tolist

转换为list

triu(data,k)

以data为数据,创建一个上三角矩阵,k表示这个上三角的边接往上/下移动几条线的距离

tile

np.tile(a,(2))函数的作用就是将函数将函数沿着X轴扩大两倍。如果扩大倍数只有一个,默认为X轴

np.tile(a,(2,1))第一个参数为Y轴扩大倍数,第二个为X轴扩大倍数。本例中X轴扩大一倍便为不复制。

repeat

tile是把ndarray当作一个整体复制的,repeat就是逐行/逐列复制

repeat只能沿着一个轴复制,无法像tile一样多个轴同时复制

注意和上面tile的区别

percentage

ndarray的分位数

append

拼接

delete

删除部分行/列

np.timedelta(num,'x')

计算两个datetime中间差多少时间间隔(向下取整)【YMWDhmsmsusns

转置

where

numpy.where() 有两种用法:

1. np.where(condition, x, y)

满足条件(condition),输出x,不满足输出y。*如果y是数组的话,输出y相应位置的元素

2. np.where(condition)

只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标。

这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,分别对应符合条件元素的各维坐标。

fromstring

从string中提取成ndarray

 只能读取一个数值序列

番外篇:理解axis

前面我们提到了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]

换一种理解就是:

有两组数据,它们的维度都是(2,3),即都是两行三列的数据。

当axis设为0时,表示我们要修改第一个维度的数据,两组数据的第一个维度都是2,当它们合并时就变成了4,所以合并后的数据的维度就是(4,3),即变成了四行三列。同理,axis设为1,合并后的数据维度就变成了(2,6),即两行六列~

同理,axis参数在其他方法里也可以用同样的方法思考,比如求均值的mean方法,当axis设为0时,对第一个维度的数据进行求均值,维度为(2,3)的数据计算完后就变成了维度为(1,3)的数据

5 文件处理

tofile() & fromfile()

tofile()将数组中的数据以二进制格式写进文件

tofile()输出的数据不保存数组形状和元素类型等信息

fromfile()函数读回数据时需要用户指定元素类型,并对数组的形状进行适当的修改

读入数据的时候,需要设置正确的dtype参数,并且修改属组的shape属性,才会得到和原始数据一致的结果

sep参数:tofile 和 fromfile中数值的分隔符

save() & load()

NumPy专用的二进制格式保存数据,它们会自动处理元素类型和形状等信息

如果load出来的不是ndarray,那可能是以压缩形式存储的

解决方法如下:

 

savez()

将多个数组保存到一个文件中

savez()的第一个参数是文件名,其后的参数都是需要保存的数组

 没有起名的话就是'arr_0","arr_1",....起来名字的就是所起的名字((如果不知道取了哪些名字,那就r.files找就可以)

savez_compressed()

在savez的基础上 进行一次数据压缩

ndarray写入csv

先转化成DataFrame

savetxt() & loadtxt()

  • 读写1维和2维数组的文本文件
  • 可以用它们读写CSV格式的文本文件
  • loadtxt 有一个参数是skiprows,表示跳过几行的内容

isnan

判断ndarray里面的元素是否是NaN

6 set_printoptions

6.1 保留几位小数

rand_arr = np.random.random([5,3])

np.set_printoptions(precision=3)
rand_arr[:4]
'''
array([[0.533, 0.978, 0.868],
       [0.248, 0.655, 0.559],
       [0.585, 0.662, 0.718],
       [0.087, 0.431, 0.201]])
'''

rand_arr = np.random.random([5,3])

np.set_printoptions(precision=7)
rand_arr[:4]
'''
array([[0.0133688, 0.8744358, 0.7132955],
       [0.9936528, 0.4186267, 0.8520905],
       [0.3911983, 0.274797 , 0.5786427],
       [0.863201 , 0.7360145, 0.7583792]])
'''

6.2 输出多少个数

np.set_printoptions(threshold=6)
a = np.arange(15)
a
#array([ 0,  1,  2, ..., 12, 13, 14])

np.set_printoptions(threshold=15)
a = np.arange(15)
a
#array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

import sys
np.set_printoptions(threshold=sys.maxsize)
a = np.arange(15)
a
#array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

 python 笔记:爱因斯坦求和 einsum_UQI-LIUWJ的博客-CSDN博客

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UQI-LIUWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值