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 相关文章推荐
tornado捕获和处理404错误的方法
Feb 26 Python
Python实现识别手写数字 简易图片存储管理系统
Jan 29 Python
Python随机函数random()使用方法小结
Apr 29 Python
Django中的文件的上传的几种方式
Jul 23 Python
Python中format()格式输出全解
Apr 12 Python
FFrpc python客户端lib使用解析
Aug 24 Python
python使用socket 先读取长度,在读取报文内容示例
Sep 26 Python
Python实现不规则图形填充的思路
Feb 02 Python
OpenCV中VideoCapture类的使用详解
Feb 14 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
基于python 取余问题(%)详解
Jun 03 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
php取得字符串首字母的方法
2015/03/25 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
php解决约瑟夫环算法实例分析
2019/09/30 PHP
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
关于删除时的提示处理(确定删除吗)
2013/11/03 Javascript
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
JS继承用法实例分析
2015/02/05 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
AngularJs实现聊天列表实时刷新功能
2017/06/15 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
微信小程序媒体组件详解(视频,音乐,图片)
2017/09/19 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
vue 点击按钮增加一行的方法
2018/09/07 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
[02:21]十步杀一人,千里不留行——DOTA2全新英雄天涯墨客展示
2018/08/29 DOTA
python解析xml文件实例分析
2015/05/27 Python
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
python实现转圈打印矩阵
2019/03/02 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
经典演讲稿范文
2013/12/30 职场文书
单位介绍信范文
2014/01/18 职场文书
学生会竞选演讲稿纪检部
2014/08/25 职场文书
美国旅游签证工作证明
2014/10/14 职场文书
铣工实训报告
2014/11/05 职场文书