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 相关文章推荐
python求pi的方法
Oct 08 Python
python安装oracle扩展及数据库连接方法
Feb 21 Python
Python中顺序表的实现简单代码分享
Jan 09 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
python DataFrame 取差集实例
Jan 30 Python
python发送多人邮件没有展示收件人问题的解决方法
Jun 21 Python
Django中间件基础用法详解
Jul 18 Python
python redis连接 有序集合去重的代码
Aug 04 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
Jan 14 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
Django框架模板用法详解
Jun 10 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使用数组实现队列
2012/02/05 PHP
解析php中memcache的应用
2013/06/18 PHP
PHP实用函数分享之去除多余的0
2015/02/06 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
一个不错的用JavaScript实现的UBB编码函数
2007/03/09 Javascript
在线编辑器中换行与内容自动提取
2009/04/24 Javascript
TinyMCE 新增本地图片上传功能
2010/11/05 Javascript
HTML5之lang属性与dir属性的详解
2013/06/19 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
JavaScript中call和apply方法的区别实例分析
2018/08/03 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
[01:04]DOTA2:伟大的Roshan雕塑震撼来临
2015/01/30 DOTA
[51:00]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python列表(list)常用操作方法小结
2015/02/02 Python
简单解决Python文件中文编码问题
2015/11/22 Python
Python 专题三 字符串的基础知识
2017/03/19 Python
使用python实现接口的方法
2017/07/07 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
python将四元数变换为旋转矩阵的实例
2019/12/04 Python
python实现输入的数据在地图上生成热力图效果
2019/12/06 Python
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
特色冷饮店创业计划书
2014/01/28 职场文书
师范生见习报告
2014/10/31 职场文书
python开发实时可视化仪表盘的示例
2021/05/07 Python
详解Vue router路由
2021/11/20 Vue.js