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中if __name__ == "__main__"详细解释
Oct 21 Python
python标准算法实现数组全排列的方法
Mar 17 Python
python对url格式解析的方法
May 13 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
Dec 14 Python
python机器学习实战之树回归详解
Dec 20 Python
Python实现的旋转数组功能算法示例
Feb 23 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
python面试题Python2.x和Python3.x的区别
May 28 Python
如何在Django中使用聚合的实现示例
Mar 23 Python
Django调用百度AI接口实现人脸注册登录代码实例
Apr 23 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 Python
python字符串的多行输出的实例详解
Jun 08 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的计数器程序
2006/10/09 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
PHP中使用循环实现的金字塔图形
2014/11/08 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
2015/12/24 PHP
php使用curl详细解析及问题汇总
2016/08/11 PHP
Laravel多用户认证系统示例详解
2018/03/13 PHP
PHP实现生成数据字典功能示例
2018/05/24 PHP
基于jquery的跨域调用文件
2010/11/19 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
详解Node.js包的工程目录与NPM包管理器的使用
2016/02/16 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
2017/02/20 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
基于AngularJS的简单使用详解
2017/09/10 Javascript
分析JS中this引发的bug
2017/12/12 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
jQuery实现可以扩展的日历
2020/12/01 jQuery
JavaScript canvas实现雨滴特效
2021/01/10 Javascript
[02:33]2014DOTA2 TI每日综述 LGD涉险晋级DK闯入胜者组
2014/07/14 DOTA
[02:53]DOTA2亚洲邀请赛 NewBee战队巡礼
2015/02/03 DOTA
python执行等待程序直到第二天零点的方法
2015/04/23 Python
Python 中开发pattern的string模板(template) 实例详解
2017/04/01 Python
python requests post多层字典的方法
2018/12/27 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
wxPython实现绘图小例子
2019/11/19 Python
python数据预处理方式 :数据降维
2020/02/24 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
感恩教师节演讲稿
2014/09/03 职场文书
六一领导慰问欢迎词
2015/01/26 职场文书
JavaScript前端面试组合函数
2022/06/21 Javascript