Numpy基础包
标量(scalar)
在python中只存在int、float两种数据类型,在numpy中像int就出现了int8、int16、int64等多种数据类型 更多与C数据类型兼容,要想转换python版本 可以使用对应的int()方法,以下是numpy中层次结构的数据类型:
- 标量作为对象,也有自己的类型、方法 部分同ndarray对象相同,不过前者属性是不可变。
- 可以作为0维数组进行index
常量
- 不同于标量,可理解系统标量,numpy包中已经设定了固定value的,一般有无穷大inf 以及对应的判断:isinf 需要的时候去查对应文档:Numpy常量
数组基本运算
- 加减乘除:针对每个元素进行计算
- @操作符、dot点乘函数(待续) 或者放在后面在写
+= 、*=操作
在python 类似a+=b 中将会创建一个新对象a,存储在其他的内存地址上,而在numpy中则不会出现
广播(broadcast)
出现了什么问题?
-
一个新概念的产生必然是为了解决某个问题,所以来看一下在numpy中出现了什么状况:两个形状不同的数组之间如何求和?
numpy广播做了什么
多维数组该如何处理:
- 从被操作的各个数组的形状元组尾端开始,确保他们相同或者其中一个维度是1,下例中:两者shape元组中尾端均是3,arr1维度为1对应的是arr2维度是4,则广播机制可以扩充arr1只有1个元素的轴上到4个元素,即arr2对应轴上元素的个数
- 从shape元组尾端开始看元素个数不同,将会报错;下例中 a尾端第一个是4,b对应的是3
广播机制进一步讲解
- numpy中创建数组有一个方法:array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0)其中ndmin表示的是要创建的数组对象最小维度,如果obj提供维度小于ndmin,则会在left_pading 值为:1
- array中最小维度与广播机制有何关系呢?其实可以看到在上述示意图中存在很多缩放,我们也可以当作维度扩充
- 广播机制可以用以下一段伪代码解释:
- 举例说明:
索引
基本索引
python中的sequence[index]扩展到了numpy中,python中作为索引的有integer、slice对象 slice(value1,value2,value3)以及冒号[start:stop:step],在numpy中存在以下几种类型:
newaxis
newaxis 等同于None,在newaxis所在索引中的位置添加1个维度
Ellipsis
Ellipsis 等同于(...),又名3个点号(...),为了扩展冒号:代表产生完整索引元组所需的冒号
注意
通过x[index] =value,为了确保赋值正确,需要确保index对应shape与value对应shape符合广播规则
整数索引
- 纯整数索引各自所在的位置分别代表各对应的轴,同时还可以与切片进行组合使用,切片获得的是数组的view,高级索引获得的是数据的副本。
高级索引(数组索引、布尔索引)
- 索引中使用了ndarray对象即数组对象的时候,其中ndarray数据类型是布尔类型、整数类型将会触发高级索引。
数组索引
- x[obj] 当obj对象是ndarray的时候:
- 高级索引相邻arr[ind1,ind2,:]:
- 高级索引被切片相隔arr[ind1,:,ind2]:
- 高级索引与ix_
- numpy.ix_方法是使用N个1D数组形成网格索引,类似于渔网,确定竖条、横条就可以确定每个点的位置,这个方法也是同一个道理,在通用函数中会详细讲解。
索引的复制与切片的视图
-
切片使用的是原数组的视图 view,共享同一段内存地址的内容,在对y进行赋值的时候,需确保赋值对象与被赋值对象shape符合广播,否则将会报错。
+ 以下修改y,修改以后的值同样会反映到数组x对象对应位置上去。
-
形状不符合广播
索引额外补充
布尔索引
- 数组中数据类型是Bool_,表达式或True、 False,布尔索引中最需要注意一点:布尔数组与被索引数组对应尺寸一定要相同,否则将会报错:IndexError: boolean index did not match indexed array along dimension
- 布尔数组维度低于被索引数组维度,类似于整数索引中x[i,...],默认了剩余所有维度
- 不同于整数索引数组,布尔数组只显示为True的元素,根据True元素所在布尔数组中的索引位置,对应匹配被索引数组的value
- 以下布尔数组为(2,3)形状与x数组对应尺寸相同,此时布尔数组b的维度小于x数组,等同于x[b,...],补齐x数组剩余所有维度
- 布尔数组b中存在4个True,x中未使用维度为5,最后经过布尔数组索引后,形成新的维度为(4,5)
合并与分割
concatenate
- concatenate((arr1,arr2,...),axis=)最主要是合并数组、以及轴两个参数,作为通用合并函数
- 多维数组合并:
分割split
- split是将concatenate合并以后的数组进行分割,同合并一样,分为通用,vsplit、hsplit,需注意的是 split将数组拆分为子数组,并将其作为数组的视图
vstack、vsplit
- Vstack(tuple)中文其实是沿着轴0方向去合并,等同于 np.concatenate((arr1,...),axis=0),前者处理不超过3个dimension的数组效率高,
- vsplit 可以还原由vstack合并的数组,默认为第一根轴的split的另一种方法
hstack、hsplit
dstack、dsplit
- 因为dstack是处理沿着第三根轴的合并,所以需关注的是dstack对于1D 数组(N,)经过reshape (1,N,1),二维数组(M,N)reshape以后成为(M,N,1)
stack 堆叠
- 其实stack也可以看作是合并,不过不同于concatenate,stack是自己创造出一根新轴,然后沿着该轴进行合并,部分源代码如下:
ix_
- 利用多个序列构建网格,可以用于索引,numpy.ix_(*args) 接收N个1D数组
r_
- r_不是作为一个函数,使用方法有以下三种形式:
- r_['r'、r_['c']: 返回矩阵
- r_[str,array1,array2,...arrayn],其中str参数是可包含3个数字的字符串,‘a,b,c’,b代表生成的result最小维度ndmin,c代表各array1,、array2,...的shape元组在result中shape元组中的位置,a代表最后经过处理的各array沿着轴a代表的轴进行concatenate
-
r_代码拆解
r_带有字符串的时候,功能可以分解成以下几个功能:分别将各数组按照第2个参数扩展维度,然后按照第三个参数设定进行转置,然后在第一个参数指定轴进行合并
k = np.array([1,2,3], copy=False, subok=True,ndmin=4) #ndmin=4 ----(1,1,1,3)---经过c参数以后--(-2代表数组的shape元组位于result对应的倒数第二位)即(1,1,3,1)
arr= k.transpose((0,1,3,2)) #注意了 经过c参数以后 相当于将轴3与轴2元素对调,故而得到(01,3,2)然后进行转置
k1 = np.array([2,3,4], copy=False, subok=True,ndmin=4) # shape--(1,1,1,3)--同理 (1,1,3,1)
arr1 = k1.transpose((0,1,3,2))
print(np.concatenate((arr,arr1),axis=0)) -
附上r_部分源代码,方便以后查询:
- r_中包含slice对象,相当于np.arrange(start,stop,step)
c_
- c_[] 相当于 r_['-1,2,0']
重复 (repeat)
- 对数组的元素层面进行操作,repeat((a, repeats, axis=None))
拼接(tile)
- 内部实现也是通过重复 repeat,类似于广播机制,可用于创建数组 通过给定次数重复
排序(sort)
- sort对数组进行排序 ,沿着轴或者按照指定字段进行排序
argsort
- 可用作索引index,返回经过sort排序的数组的索引,换一句话说用各数字在原数组中索引来代替在排序result中本该由该数字本身放置位置的呈现
take_along_axis
- 根据在对应轴上的索引值返回数组
take
- 沿着指定轴 获取该轴方向上的元素,np.take(arr,indices,axis=2) 等同于a[funcy_index] 其中funcy_index = (:,:,indices,...)
插入(insert)
- 对数组应用insert,返回的是输入数组arr的copy版本,对原数组不会有影响;
- numpy.insert(arr, obj, values, axis=None) insert是根据obj作为输入数组arr的索引,在对应索引之前插入对应values
- 背后是对索引数组的赋值,arr[...,obj,...] =values 需保证values可以广播到arr该索引结果的形状中去
__EOF__

本文链接:https://www.cnblogs.com/ivan09/p/14257529.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)