Python数组变形的几种实现方法


Posted in Python onMay 30, 2022

1.reshape

reshape是重塑,常用的三种写法如下:

numpy.arange(n).reshape(a, b)    
# 依次生成 n个自然数,并且以 a行 b列的数组形式显示
numpy.arange(a,b,c)    
# 从数字 a起, 步长为 c, 到 b结束,生成 array
numpy.arange(a,b,c).reshape(m,n) 
# 将array的维度变为 m 行 n 列。

例一:

import numpy as np
arr=np.arange(1,25.0).reshape(4,6)

Python数组变形的几种实现方法

关于order:
order可以是数组排序的方向不同
(1)order='F'列为主序
(2)order='C'行为主序

一种是以order='F'的方式让数组竖着排序:

arr=np.arange(1,25.0).reshape((6,-1),order='F')

Python数组变形的几种实现方法

一种是以order='C'的方式让数组横着排序:

arr=np.arange(1,25.0).reshape((6,-1),order='C')

Python数组变形的几种实现方法

reshapeflattern:
前者完成的是从低维到高维的转换,后者则相反,还可以使用reval函数

2.flatten

numpy.ndarray.flattern()是用来返回一维数组的函数。
也可以像reshape一样使用order

arr2=arr.flatten(order='F')

Python数组变形的几种实现方法

一般默认是使用order='C',有特定需求则使用order='F'

Python数组变形的几种实现方法

flatten()返回的是拷贝,意味着改变元素的值不会影响原始数组。

Python数组变形的几种实现方法

3.ravel

ravel()方法将数组维度拉成一维数组

ravelflatten的区别:

  • ravel在进行扁平化处理的时候没有复制原来的数组,只在列主序打平时复制原来的数组
  • flatten在所有情况下打平时都复制了原来的数组
  • ravel()返回的是视图,意味着改变元素的值会影响原始数组;
  • flatten()返回的是拷贝,意味着改变元素的值不会影响原始数组。
  • 相同点:这两个函数的功能都是将多维数组转换成一维

Python数组变形的几种实现方法

ravel()返回的是视图,意味着改变元素的值会影响原始数组;

4.stack

numpy.stack(arrays, axis=0):沿着新轴连接数组的序列。

一系列的stack函数有:stack(),hstack(),vstack()

(1)concatenate

还有属性例如:concatenate
numpy.concatenate((a1,a2,…), axis=0)函数,能够一次完成多个数组的拼接。其中a1,a2,…是数组类型的参数

arr1=['穿过寒冬拥抱你','反贪风暴5:最终章','李茂扮太子','误杀2']
arr2=['以年为单位的恋爱','爱情神话','黑客帝国:矩阵重启','雄狮少年']
np.concatenate([arr1,arr2])

Python数组变形的几种实现方法

注意,两个list合并的时候需要用到 [ ] ,否则出错。

Python数组变形的几种实现方法

Python数组变形的几种实现方法

axis参数指定新轴在结果尺寸中的索引。例如,如果axis=0,它将是第一个维度,如果axis=-1,它将是最后一个维度。

默认情况下axis=0

arr1=np.arange(1,25.0).reshape(4,6)
arr2=np.arange(26,50.0).reshape(4,6)
np.concatenate([arr1,arr2],axis=1)
np.concatenate([arr1,arr2],axis=0)

Python数组变形的几种实现方法

如上图所示,axis=1是将不同的列串联起来,axis=0则类似于append,是合并。

arr1arr2进行对调:

Python数组变形的几种实现方法

(2)vstack

函数原型:vstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组。它是垂直(按照行顺序)的把数组给堆叠起来。

vstack 和concatenate( ),axis=0等价

Python数组变形的几种实现方法

(3)dstack

dstack是deep stack,即在深度方向进行合并。

dstack可以将一维数组变成三维数组。

import numpy as np

# vstack
np.vstack([arr1,arr2])
#结果:
array([[ 1.,  2.,  3.,  4.,  5.,  6.],
       [ 7.,  8.,  9., 10., 11., 12.],
       [13., 14., 15., 16., 17., 18.],
       [19., 20., 21., 22., 23., 24.],
       [26., 27., 28., 29., 30., 31.],
       [32., 33., 34., 35., 36., 37.],
       [38., 39., 40., 41., 42., 43.],
       [44., 45., 46., 47., 48., 49.]])
       
# dstack
np.dstack([arr1,arr2])
# 结果:
array([[[ 1., 26.],
        [ 2., 27.],
        [ 3., 28.],
        [ 4., 29.],
        [ 5., 30.],
        [ 6., 31.]],

       [[ 7., 32.],
        [ 8., 33.],
        [ 9., 34.],
        [10., 35.],
        [11., 36.],
        [12., 37.]],

       [[13., 38.],
        [14., 39.],
        [15., 40.],
        [16., 41.],
        [17., 42.],
        [18., 43.]],

       [[19., 44.],
        [20., 45.],
        [21., 46.],
        [22., 47.],
        [23., 48.],
        [24., 49.]]])

(4)hstack

函数原型:hstack(tup) ,参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组,水平(按列顺序)把数组给堆叠起来,vstack()函数正好和它相反。

Python数组变形的几种实现方法

(5)r,c模式

np.r_[arr1,arr2] ,实际上是vstack 与 axis=0 做了一个合并(concatenate)。
np.c_[arr1,arr2] , hstack 与 axis=1 做了一个合并(concatenate)。

Python数组变形的几种实现方法

print(np.r_[-2:2:1,[0]*3,5,6])

上面那段代码由三部分组成,-2:2:1表示从-2~2的数字,间隔为1,并且2没有,然后是3个0,接下来是5和6

Python数组变形的几种实现方法

print((np.r_['r',-2:2:1,[0]*3,5,6])) #二维数组,以行的方式呈现
print((np.r_['c',-2:2:1,[0]*3,5,6])) #二维数组,以列的方式呈现

Python数组变形的几种实现方法

默认是为r,表示沿着行的方向创建,c则表示以列的方式创建。

注:shape表示矩阵的维度大小。

Python数组变形的几种实现方法

也可以用'a,b,c'来进行表示,a代表轴,沿着轴a来进行合并,代表合并后数组维度至少是bc是代表在第c维度上做维度提升

print(np.r_['0,2,0',[1,2,3],[4,5,6]],'\n')
print(np.r_['0,2,1',[1,2,3],[4,5,6]],'\n')
print(np.r_['1,2,0',[1,2,3],[4,5,6]],'\n')
print(np.r_['1,2,1',[1,2,3],[4,5,6]])

Python数组变形的几种实现方法

b:合并后数组的维度
 a=0,沿着轴0合并。(3,)-->(1,3)
 a=1,沿着轴1合并。(3,1)-->(3,2)
 c=0,在轴0上上升一维,(3,)-->(3,1)
 c=1,在轴1上上升一维,(3,)-->(1,3)

Python数组变形的几种实现方法

5.split

(1)split

split 具体有 split() , hsplit() , vsplit()

arr1=np.arange(1,13.0).reshape(2,6)
arr2=np.arange(14,26.0).reshape(2,6)
arr=np.concatenate([arr1,arr2])
arr3=np.split(arr,2)   # 默认情况下是 axis=0

Python数组变形的几种实现方法

由上图可知,split分割成为二维数组

arr4=np.split(arr,3,axis=1)
print(arr4[0].shape)
arr4

Python数组变形的几种实现方法

arr5=np.split(arr,4,axis=0)
arr6=np.split(arr,[1,2,3],axis=0)

上述代码块的两行表示是相同的,第二行相当于使用数组的切片方式进行处理。

Python数组变形的几种实现方法

(2)vsplit和hsplit

  • vsplit 垂直(按行)将阵列拆分为多个子阵列。
  • hsplit 水平(按列)将阵列拆分为多个子阵列。

这部分希望大家看下图体会~

arrv=np.vsplit(arr,[1,2,3,4])
arrh=np.hsplit(arr,[1,2,3,4,5])

Python数组变形的几种实现方法

Python数组变形的几种实现方法

6.repeat

repeat(): 复制数组中的每个指定元素。
一维数组:用整数型和列表型参考来控制元素被复制的个数
多维数组:用整数型和列表型来控制元素被复制的个数

import numpy as np
arr=np.arange(3)
print(arr.shape)

(1)标量参数

print(arr.repeat(3))   # 每个元素复制三次

Python数组变形的几种实现方法

(2)列表参数

print(arr)
print(arr.repeat([1,2,3]))  
# 第一个没有复制,第二个复制了两个,,依次类推

Python数组变形的几种实现方法

当列表的元素少于数组元素,或者多余数组元素,都会报错,就如下图所示。

Python数组变形的几种实现方法

上面是一维数组的,接下来再看看二维数组中利用标量参数和轴参数:

Python数组变形的几种实现方法

print(arr.repeat(2)) # 此时二维数组变成一维的了
print(arr.repeat(2,1)) 
print(arr.repeat(2,axis=0)) # 在行上面进行复制

Python数组变形的几种实现方法

再来看看二维数组中的列表参数和轴参数:

Python数组变形的几种实现方法

7.tile

关于repeat和title,二者的本质都是复制,而repeat是在元素层面进行赋值,title是在数组层面进行赋值。

(1)标量参数

print(np.tile(arr,2))
print(np.repeat(arr,2))

Python数组变形的几种实现方法

(2)元组参数

元组参数即括号里面用相关参数进行分割。

print(np.tile(arr,(2,3)))

Python数组变形的几种实现方法

print(np.tile(arr,(2,3,4)))

在轴0上面复制两遍,复制3遍,复制4遍。

Python数组变形的几种实现方法

8.sort

排序分为:

  • 直接排序
  • 间接排序

直接排序sort() :在原来的数组上进行排序操作,而不重新创建一个数组

(1)一维数组排序方法

arr=np.array([9,1,5,7,2,3,8,6]) # 先创建一个无序数组
arr
print('排序之前的数组:',arr)
arr.sort()
print('排序之后的数组:',arr)

Python数组变形的几种实现方法

arr[::-1] # 使用倒序的方法显示

Python数组变形的几种实现方法

(2)多维数组排序方法

先使用random随机生成一个二维数组:(每次)

import numpy as np
np.random.seed(1000)
arr=np.random.randint(40,size=(3,4))
arr

以上的方法在每次重新刷新了之后会变化数组的数字。

Python数组变形的几种实现方法

如果对二维数组直接使用arr.sort(),则会直接对行进行排序。

Python数组变形的几种实现方法

对列进行排序:

print('排序之前的数组:')
print(arr)
arr[:,0].sort()
print('排序之后的数组:')
print(arr)

Python数组变形的几种实现方法

np.sort(arr[:,2]) # 选择第三列进行排序

Python数组变形的几种实现方法

arr.sort(axis=1) # 横着排序,原来数组改变
np.sort(arr,axis=1) # 横着排序,但原来的数组不会改变
arr.sort(axis=0) # 竖着排序,原来数组改变
np.sort(arr,axis=0) # 竖着排序,但原来的数组不会改变

Python数组变形的几种实现方法

Python数组变形的几种实现方法

(3)argsort函数

接下来看看间接排序:

间接排序:利用特定的参数进行排序,按需排序,需要使用argsort( )函数
argsort函数:返回的是数组值从小到大的索引值。

score=np.array([100,65,76,89,58])
idx=score.argsort()
idx

Python数组变形的几种实现方法

因此如果打印数组的时候带上下标就相当于排序了:

print(score[idx]) # 利用索引标签来打印

Python数组变形的几种实现方法

arr[:,arr[0].argsort()]
#按第一行从低到高进行排序,并且对应的列也会跟着变化 
arr#由于使用的是argsort,因此原数组不会改变

Python数组变形的几种实现方法

(4)lexsort函数

numpy.lexsort() 用于对多个序列进行排序。把它想象成对电子表格进行排序,每一列代表一个序列,排序时优先照顾靠后的列。

这里举一个应用场景:小升初考试,重点班录取学生按照总成绩录取。在总成绩相同时,数学成绩高的优先录取,在总成绩和数学成绩都相同时,按照英语成绩录取…… 这里,总成绩排在电子表格的最后一列,数学成绩在倒数第二列,英语成绩在倒数第三列。

arr1=np.array(['E','B','C','A','D'])
arr2=np.array(['4','1','3','2','5'])
idx=np.lexsort((arr1,arr2))

Python数组变形的几种实现方法

9.insert

insert 是插入,但原数组不会改变。

arr=np.arange(6)
np.insert(arr,1,100) # 在下标为1的位置插入100

Python数组变形的几种实现方法

arr=np.arange(6)
np.insert(arr,1,100) # 在下标为1的位置插入100

Python数组变形的几种实现方法

10.delete

delete是删除,但原数组同样不会改变。

arr=np.arange(6)
np.delete(arr,1)
np.delete(arr,[1,2])

Python数组变形的几种实现方法

11.copy

关于copyview ,这里需要了解一下数组切片和列表切片的区别:

  • 数组切片得到的是原数组的一个view(视图),修改切片中的内容改变原来数组
  • 列表切片得到的是原列表的一个copy(复制),修改切片后的列表不会改变原列表
arr=np.arange(6)
arr_copy=arr.copy()
arr_copy[0]=100
arr_copy

Python数组变形的几种实现方法

12.view

arr=np.arange(6)
arr_view=arr.view()
arr_view[0]=100
arr_view

Python数组变形的几种实现方法

讲了以上12种数组变形,那么如何使用容器型数据的特性和数组相关函数的方法对字符串或者其他对象进行去重呢?

s='数组切片得到的是原数组的一个,修改切片中的内容会改变原来数组'

假设现在要对s进行去重:

方法一:使用set

sets=set(s)

Python数组变形的几种实现方法

方法二:使用unique

sarr=np.array(s)
np.unique(list(s))

Python数组变形的几种实现方法

 到此这篇关于Python数组变形的几种实现方法的文章就介绍到这了!


Tags in this post...

Python 相关文章推荐
在Linux中通过Python脚本访问mdb数据库的方法
May 06 Python
Python实现中文数字转换为阿拉伯数字的方法示例
May 26 Python
Python中使用支持向量机SVM实践
Dec 27 Python
详解django三种文件下载方式
Apr 06 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
Apr 18 Python
python: 自动安装缺失库文件的方法
Oct 22 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
python实现高斯投影正反算方式
Jan 17 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
完美解决keras保存好的model不能成功加载问题
Jun 11 Python
聊聊pytorch测试的时候为何要加上model.eval()
May 23 Python
Python Matplotlib绘制动画的代码详解
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 #Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
May 30 #Python
Pandas实现批量拆分与合并Excel的示例代码
May 30 #Python
Python实现仓库管理系统
May 30 #Python
python单向链表实例详解
May 25 #Python
利用Python实现模拟登录知乎
May 25 #Python
You might like
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
详解php中反射的应用
2016/03/15 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
2016/06/20 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
jQuery插件Validation快速完成表单验证的方式
2016/07/28 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
ES6新特性之Symbol类型用法分析
2017/03/31 Javascript
js时间查询插件使用详解
2017/04/07 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
微信小程序实现默认第一个选中变色效果
2018/07/17 Javascript
node.js使用redis储存session的方法
2018/09/26 Javascript
vue实现循环切换动画
2018/10/17 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
2019/06/14 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
python计算牛顿迭代多项式实例分析
2015/05/07 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
python连接mongodb数据库操作数据示例
2020/11/30 Python
CSS3提交意见输入框样式代码
2014/10/30 HTML / CSS
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
拓展策划方案
2014/06/03 职场文书
《中国梦我的梦》中学生演讲稿
2014/08/20 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL
类和原型的设计模式之复制与委托差异
2022/07/07 Javascript