Python数组变形(学习笔记)

Python数组变形

  • 1.reshape
  • 2.flatten
  • 3.ravel
  • 4.stack
    • (1)concatenate
    • (2)vstack
    • (3)dstack
    • (4)hstack
    • (5)r,c模式
  • 5.split
    • (1)split
    • (2)vsplit和hsplit
  • 6.repeat
    • (1)标量参数
    • (2)列表参数
  • 7.tile
    • (1)标量参数
    • (2)元组参数
  • 8.sort
    • (1)一维数组排序方法
    • (2)多维数组排序方法
    • (3)argsort函数
    • (4)lexsort函数
  • 9.insert
  • 10.delete
  • 11.copy
  • 12.view

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数组变形(学习笔记)_第1张图片
关于order:
order可以是数组排序的方向不同
(1)order='F'列为主序
(2)order='C'行为主序

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

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

Python数组变形(学习笔记)_第2张图片
一种是以order='C'的方式让数组横着排序:

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

Python数组变形(学习笔记)_第3张图片

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

2.flatten

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

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

Python数组变形(学习笔记)_第4张图片
一般默认是使用order='C',有特定需求则使用order='F'
Python数组变形(学习笔记)_第5张图片
flatten()返回的是拷贝,意味着改变元素的值不会影响原始数组。
Python数组变形(学习笔记)_第6张图片

3.ravel

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

ravelflatten的区别:

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

Python数组变形(学习笔记)_第7张图片

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数组变形(学习笔记)_第8张图片
注意,两个list合并的时候需要用到 [ ] ,否则出错。
在这里插入图片描述
Python数组变形(学习笔记)_第9张图片
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数组变形(学习笔记)_第10张图片
如上图所示,axis=1是将不同的列串联起来,axis=0则类似于append,是合并。

arr1arr2进行对调:
Python数组变形(学习笔记)_第11张图片

(2)vstack

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

vstack 和concatenate( ),axis=0等价
Python数组变形(学习笔记)_第12张图片

(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数组变形(学习笔记)_第13张图片

(5)r,c模式

np.r_[arr1,arr2] ,实际上是vstack 与 axis=0 做了一个合并(concatenate)。
np.c_[arr1,arr2] , hstack 与 axis=1 做了一个合并(concatenate)。
Python数组变形(学习笔记)_第14张图片

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

上面那段代码由三部分组成,-2:2:1表示从-2~2的数字,间隔为1,并且2没有,然后是3个0,接下来是5和6
Python数组变形(学习笔记)_第15张图片

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

Python数组变形(学习笔记)_第16张图片
默认是为r,表示沿着行的方向创建,c则表示以列的方式创建。

注:shape表示矩阵的维度大小。
Python数组变形(学习笔记)_第17张图片
也可以用'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数组变形(学习笔记)_第18张图片

 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数组变形(学习笔记)_第19张图片

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数组变形(学习笔记)_第20张图片
由上图可知,split分割成为二维数组

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

Python数组变形(学习笔记)_第21张图片

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

上述代码块的两行表示是相同的,第二行相当于使用数组的切片方式进行处理。
Python数组变形(学习笔记)_第22张图片

(2)vsplit和hsplit

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

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

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

Python数组变形(学习笔记)_第23张图片
Python数组变形(学习笔记)_第24张图片

6.repeat

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

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

(1)标量参数

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

Python数组变形(学习笔记)_第25张图片

(2)列表参数

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

Python数组变形(学习笔记)_第26张图片
当列表的元素少于数组元素,或者多余数组元素,都会报错,就如下图所示。

Python数组变形(学习笔记)_第27张图片

上面是一维数组的,接下来再看看二维数组中利用标量参数和轴参数:
Python数组变形(学习笔记)_第28张图片

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

Python数组变形(学习笔记)_第29张图片
再来看看二维数组中的列表参数和轴参数:
Python数组变形(学习笔记)_第30张图片

7.tile

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

(1)标量参数

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

Python数组变形(学习笔记)_第31张图片

(2)元组参数

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

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

Python数组变形(学习笔记)_第32张图片

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

在轴0上面复制两遍,复制3遍,复制4遍。
Python数组变形(学习笔记)_第33张图片

8.sort

排序分为:

  1. 直接排序
  2. 间接排序

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

(1)一维数组排序方法

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

Python数组变形(学习笔记)_第34张图片

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

Python数组变形(学习笔记)_第35张图片

(2)多维数组排序方法

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

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

以上的方法在每次重新刷新了之后会变化数组的数字。
Python数组变形(学习笔记)_第36张图片

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

Python数组变形(学习笔记)_第37张图片
对列进行排序:

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

Python数组变形(学习笔记)_第38张图片

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

Python数组变形(学习笔记)_第39张图片

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

Python数组变形(学习笔记)_第40张图片
Python数组变形(学习笔记)_第41张图片

(3)argsort函数

接下来看看间接排序:

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

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

Python数组变形(学习笔记)_第42张图片
因此如果打印数组的时候带上下标就相当于排序了:

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

Python数组变形(学习笔记)_第43张图片

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

Python数组变形(学习笔记)_第44张图片

(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数组变形(学习笔记)_第45张图片

9.insert

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

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

Python数组变形(学习笔记)_第46张图片

arr1=np.insert(arr,1,100)
arr1  

Python数组变形(学习笔记)_第47张图片

10.delete

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

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

Python数组变形(学习笔记)_第48张图片

11.copy

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

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

Python数组变形(学习笔记)_第49张图片

12.view

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

Python数组变形(学习笔记)_第50张图片


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

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

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

方法一:使用set

sets=set(s)

Python数组变形(学习笔记)_第51张图片
方法二:使用unique

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

Python数组变形(学习笔记)_第52张图片

你可能感兴趣的:(Phthon,python,排序算法,开发语言,numpy)