广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python数组变形的几种实现方法
  • 194
分享到

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

2024-04-02 19:04:59 194人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录1.reshape2.flatten3.ravel4.stack(1)concatenate(2)vstack(3)dstack(4)hstack(5)r,c模式5.split(

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)

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

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

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

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

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

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

2.flatten

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

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

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

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

3.ravel

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

ravelflatten的区别:

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

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])

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

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)

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

arr1arr2进行对调:

(2)vstack

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

vstack 和concatenate( ),axis=0等价

(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()函数正好和它相反。

(5)r,c模式

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

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

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

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

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

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

也可以用'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]])

 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)

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

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

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

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

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

(2)vsplit和hsplit

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

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

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

6.repeat

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

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

(1)标量参数

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

(2)列表参数

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

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

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

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

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

7.tile

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

(1)标量参数

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

(2)元组参数

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

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

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

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

8.sort

排序分为:

  • 直接排序
  • 间接排序

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

(1)一维数组排序方法

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

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

(2)多维数组排序方法

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

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

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

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

对列进行排序:

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

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

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

(3)argsort函数

接下来看看间接排序:

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

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

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

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

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

(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))

9.insert

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

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

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

10.delete

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

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

11.copy

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

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

12.view

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

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

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

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

方法一:使用set

sets=set(s)

方法二:使用unique

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

 到此这篇关于python数组变形的几种实现方法的文章就介绍到这了,更多相关Python数组变形内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python数组变形的几种实现方法

本文链接: https://www.lsjlt.com/news/118476.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python数组变形的几种实现方法
    目录1.reshape2.flatten3.ravel4.stack(1)concatenate(2)vstack(3)dstack(4)hstack(5)r,c模式5.split(...
    99+
    2022-11-11
  • Python数组变形的实现方法有哪些
    这篇文章主要介绍了Python数组变形的实现方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python数组变形的实现方法有哪些文章都会有所收获,下面我们一起来看看吧。1.reshapereshape是...
    99+
    2023-06-30
  • Python中数组的几种使用方法
    二维数组的初始化 matirx_done = [[0 for i in range(0, len(matirx))]for j in range(0, len(matirx[0]))] 就将其初始化为一个与matrix相同大小...
    99+
    2023-01-31
    几种 数组 使用方法
  • Servlet实现共享数据JavaWeb组件的几种方法
    目录一、Servlet简介二、Servlet的运行过程Servlet组件:多个Servlet之间共享数据实现方案转发与重定向全局作用域对象Servlet JavaWeb三大组件包括,...
    99+
    2022-11-12
  • python数组循环的几种方式
     Python中循环数组有几种方式: for-in循环,可以遍历数组中的每一个元素。while循环,使用索引进行循环。列表推导式,可以快速创建新的列表。递归,可以遍历多维数组。 for-in循环 arr = [1, 2, 3, 4, 5]f...
    99+
    2023-09-03
    python 开发语言
  • JavaScript中清空数组的几种方法
    目录Array.prototype.splice()将 length 设置为 0分配新的空数组length = 0和 Array = [] 之间的差异?Array.prototype...
    99+
    2023-02-17
    JavaScript清空数组
  • React中如何传入组件的props改变时更新组件的几种实现方法
    这篇文章将为大家详细讲解有关React中如何传入组件的props改变时更新组件的几种实现方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。何时使用派生状态咱们先来看一个比...
    99+
    2022-10-19
  • Python传入参数的几种方法
    Python传入参数的方法有:位置参数、默认参数、可变参数、关键字参数、和命名关键字参数、以及各种参数调用的组合 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用这...
    99+
    2023-01-31
    几种方法 参数 Python
  • python中取整数的几种方法
    目录1、向下取整: int()2、向上取整:ceil()3、四舍五入:round()4、分别取 1、向下取整: int() >>> a = 14.38 >...
    99+
    2022-11-12
  • C++中实现fibonacci数列的几种方法
    目录前言一、fibonacci数列是什么?二、递归实现1.递归的特点2.C++实现三、循环实现1.C++实现2.时间复杂度四、矩阵实现1.理论推导2.C++实现3.时间复杂度前言 f...
    99+
    2022-11-13
  • 浅谈shell 遍历数组的几种方法
    背景 某天遇到一个问题,现象如下:第一种遍历正常打印元素,然而第二种遍历只会打印一个元素! #!/bin/bash # $1 代表文件目录 # 执行 eg: # sh your_shell.sh /user/li...
    99+
    2022-06-04
    shell 遍历数组
  • 数组array的5类方法有哪几种
    本篇内容介绍了“数组array的5类方法有哪几种”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、数组变形...
    99+
    2022-10-19
  • Javascript数组去重的几种方法详解
    目录数组去重1 双层for循环(类似冒泡排序的双层循环写法)2 循环和indexof、循环和includes3 利用对象属性不能重复去重4 ES6 Set5 ES6 Array. p...
    99+
    2022-11-12
  • JavaScript数组去重的几种方法详谈
    目录一、Set去重二、双重for循环去重三、利用indexOf去重四、利用icludes去重五、filter六、Map总结一、Set去重 function funSet(arr...
    99+
    2022-11-12
  • JavaScript判断数组成员的几种方法
    目录indexOf()incudes()find()与findIndex()find()findIndex()对于NaN值最后前言: 在开发中经常需要我们在数组中查找元素又或者是判断...
    99+
    2022-11-13
    JavaScript判断数组成员方法 JavaScript判断数组成员
  • JS数组降维的几种方法详解
    二维数组降维 使用数组实例方法concat和ES6扩展运算符降维 let arr=[1,2,[3,4],5]; let arr1=[].concat(...arr); ...
    99+
    2022-11-12
  • 关于python单例的常用几种实现方法
    这两天在看自己之前写的代码,所以正好把用过的东西整理一下,单例模式,在日常的代码工作中也是经常被用到, 所以这里把之前用过的不同方式实现的单例方式整理一下   装饰器的方式 这种方式也是工作中经常用的一种,用起来也比较方便,代码实现如下 ...
    99+
    2023-01-30
    几种 常用 方法
  • echarts中几种渐变方式的具体实现方式
    目录在echarts 中实现渐变的具体几种方式方式一:方式二:colorStops总结在echarts 中实现渐变的具体几种方式 在我们日常使用Echarts图表过程中,会遇到一些要...
    99+
    2022-11-16
    echarts渐变方式 echarts 渐变
  • uniapp实现全局变量的几种方式总结
    目录前言1. 模块2. Vue.prototype3.  globalData4. vuex总结前言 在开发的过程中,我们不可避免的用到全局变量,比如我们的请求的公共路径这...
    99+
    2022-11-13
    uniapp全局变量四种实现方式 uniapp实例教程 uniapp全局变量使用
  • Python实现"验证回文串"的几种方法
    一、LeetCode——125.验证回文串 1.问题描述 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作