NumPy数组与矩阵(二)


前言

NumPy中包含了一些函数用于处理数组,大概可以分为以下几类;

  • 修改数组形状;
  • 反转数组;
  • 修改数组维度;
  • 连接数组;
  • 分割数组;
  • 数组元素的添加与删除;

数组排序;在数据分析的过程中,我们时常要对数据进行排序,NumPy库提供了sort函数、argsort函数和lexsort函数,每个函数的排序功能不同。

一、数组操作

1. 修改数组形状

函数描述
reshape不改变数据的条件下改变形状
flat数组元素迭代器
flatten返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
ravel返回展开数组
numpy.reshape(arr, newshape, order='C')
  • arr:表示要修改形状的数组名称
  • newshape:整数或者整数数组
  • order:元素排序,C,按行排序,F,按列排序,A按原顺序排序,K,按照元素在内存中出现的舒徐排序
import numpy as np
a = np.arange(12)
b = a.reshape(3,4)
返回值:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

2. 反转数组

函数描述
transpose兑换数组的维度
ndarray.T和self.transpose()相同
rollaxis向后滚动指定的轴
swapaxes兑换数组中的两个轴
numpy.transpose(arr, axes)
  • arr:要操作的数组
  • axes:整数列表,对应维度,通常所有的维度都会兑换
a = np.arange(20).reshape(5,4)
b = np.transpose(a)
返回值:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19]])
array([[ 0,  4,  8, 12, 16],
       [ 1,  5,  9, 13, 17],
       [ 2,  6, 10, 14, 18],
       [ 3,  7, 11, 15, 19]])
a = np.arange(16).reshape(4,4)
a.T
返回值:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
array([[ 0,  4,  8, 12],
       [ 1,  5,  9, 13],
       [ 2,  6, 10, 14],
       [ 3,  7, 11, 15]])

3. 修改数组维度

维度描述
broadcast产生模仿广播的对象
broadcast_to将数组广播到新形状
expand_dims扩展数组的形状
squeeze从数组的形状中删除一维条目

NumPy的广播遵循一组严格的的规则,这组规则是为了决定两个数组之间的操作。

  • 规则1:如果两个数组的维度数不相同,那么小维度数组的形状将会在最左边补1;
  • 规则2:如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度为1的维度扩展以匹配另外一个数组的形状;
  • 规则3:如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于1,那么会引发异常。
A = np.arange(9).reshape(3, 3)
B = np.arange(3)
A + B
d = np.arange(4).reshape(1,4)
np.broadcast_to(d,(4,4))
返回值:
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
array([0, 1, 2])
array([[ 0,  2,  4],
       [ 3,  5,  7],
       [ 6,  8, 10]])
array([[0, 1, 2, 3]])
array([[0, 1, 2, 3],
       [0, 1, 2, 3],
       [0, 1, 2, 3],
       [0, 1, 2, 3]])

4. 连接数组

函数描述
concatenate连接沿现有轴的数组序列
stack沿着新的轴加入一系列数组
hstack水平堆叠序列中的数组(列方向)
vstack竖直堆叠序列中的数组(行方向)
numpy.concatenate((a1,a2,...), axis)
  • a1,a2,…:相同类型的数组;
  • axis:沿着它连接数组的轴,默认为0;
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.concatenate((a,b))
返回值:
array([[1, 2],
       [3, 4]])
array([[5, 6],
       [7, 8]])
array([[1, 2],
       [3, 4],
       [5, 6],
       [7, 8]])
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.stack((a,b),0)
np.stack((a,b),1)
返回值:
array([[[1, 2],
        [3, 4]],
       [[5, 6],
        [7, 8]]])
        
array([[[1, 2],
        [5, 6]],
       [[3, 4],
        [7, 8]]])
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.hstack((a,b))
返回值:
array([[1, 2, 5, 6],
       [3, 4, 7, 8]])
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.vstack((a,b))
返回值:
array([[1, 2],
       [3, 4],
       [5, 6],
       [7, 8]])

5. 分割数组

函数数组操作
split将一个数组分割为多个子数组
hsplit将一个数组水平分割为多个子数组(按列)
vsplit将一个数组垂直分割为多个子数组(按行)
numpy.split(ary, indices_or_sections, axis)
  • arr: 被分割的数组;
  • indices_or_sections:如果是整数,就用该数平均切分;如果是一个数组,为沿轴的位置进行切分(左开右闭);
  • axis:沿着哪个维度进行切分,默认为0,横向切分。为1时,棕向切分。
a = np.arange(12)
b = np.split(a,4)
np.split(a,[4,7])
返回值:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10, 11])]
[array([0, 1, 2, 3]), array([4, 5, 6]), array([ 7,  8,  9, 10, 11])]

numpy.hsplit函数用于水平分割数组,通过指定要返回的相同形状的数组数量来拆分原始数组。

np.floor(100 * np.random.random((3, 9)))
np.hsplit(a,3)
返回值:
array([[82., 95., 26., 57., 60., 30., 80., 33., 51.],
       [75.,  5., 70., 43., 64., 29., 67.,  7., 47.],
       [60., 86., 88.,  4., 42.,  0., 22., 28.,  8.]])
[array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8,  9, 10, 11])]
a = np.arange(12).reshape(4,3)
b = np.vsplit(a,2)
返回值:
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

[array([[0, 1, 2],
       [3, 4, 5]]), array([[ 6,  7,  8],
       [ 9, 10, 11]])]

6. 元素添加和删除

函数元素及描述
resize返回指定形状的新数组
append将值添加到数组末尾
insert沿指定轴将值插入指定下标之前
delete删掉某个轴的子数组,并返回删除后的新数组
unique查找数组内的唯一元素
a = np.array([[1,2,3],[4,5,6]])
a.shape
b = np.resize(a,(3,2))
b.shape
c = np.resize(a,(3,3))
返回值:
array([[1, 2, 3],
       [4, 5, 6]])
(2, 3)
array([[1, 2],
       [3, 4],
       [5, 6]])
(3, 2)
array([[1, 2, 3],
       [4, 5, 6],
       [1, 2, 3]])
numpy.append(arr, values, axis=None)
  • arr:输入数组;
  • values:要向arr添加的值,需要和arr形状相同(除了要添加的轴);
  • axis:默认为None,当axis无定义时,是横向加成,返回为一维数组。当axis为0时,(列数要相同),数组添加在下方。当axis为1时,数组是加在右边(行数要相同)
a = np.array([[1,2,3],[4,5,6]])
np.append(a,[7,8,9])
np.append(a, [[7,8,9]], axis = 0) #沿轴0添加元素
np.append(a, [[5,5,5],[7,8,9]], axis = 1)
返回值:
array([[1, 2, 3],
       [4, 5, 6]])
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
array([[1, 2, 3, 5, 5, 5],
       [4, 5, 6, 7, 8, 9]])
numpy.insert(arr, obj, values, axis)
  • arr:输入数组;
  • obj:在其之前插入值的索引;
  • values:要插入的值;
  • axis:沿着它插入的轴,如果未提供,则输入数组会被展开;
a = np.array([[1,2],[3,4],[5,6]])
np.insert(a,3,[11,12])
np.insert(a,1,[11],axis=0)
np.insert(a,1,11,axis=1)
返回值:
array([ 1,  2,  3, 11, 12,  4,  5,  6])
array([[ 1,  2],
       [11, 11],
       [ 3,  4],
       [ 5,  6]])
array([[ 1, 11,  2],
       [ 3, 11,  4],
       [ 5, 11,  6]])
numpy.delete(arr, obj, axis)
  • arr: 输入数组;
  • obj:指定子数组的位置,可以是切片、整数或者整数数组,表明要从指定位置删除子数组;
  • axis:沿着它删除给定子数组的轴,如果未提供,则输入数组会被展开;
a = np.arange(15).reshape(3,5)
np.delete(a,8)
np.delete(a,1,axis=1)
返回值:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
array([ 0,  1,  2,  3,  4,  5,  6,  7,  9, 10, 11, 12, 13, 14])
array([[ 0,  2,  3,  4],
       [ 5,  7,  8,  9],
       [10, 12, 13, 14]])
numpy.unique(arr, return_index, return_inverse, return_counts)
  • arr:输入数组,如果不是一维数组则会展开;
  • return_index:如果为True,返回新列表元素在就列表中的位置(下标),并以列表形式存储;
  • return_inverse:如果为True,返回旧列表元素在新列表中的位置(下标),并以列表形式存储;
  • return_counts:如果为True,返回去重数组中的元素在原数组中的出现次数。
a = np.array([1,2,3,3,2,4,5,4,8,7,2,2,5,9,6])
np.unique(a)
np.unique(a,return_index = True)
c, indices = np.unique(a,return_counts = True)
返回值:
array([1, 2, 3, 3, 2, 4, 5, 4, 8, 7, 2, 2, 5, 9, 6])
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
(array([1, 2, 3, 4, 5, 6, 7, 8, 9]), array([ 0,  1,  2,  5,  6, 14,  9,  8, 13], dtype=int64)
array([1, 2, 3, 4, 5, 6, 7, 8, 9]) # c
array([1, 4, 2, 2, 2, 1, 1, 1, 1], dtype=int64) # indices 

二、数组排序

1. sort函数

ndarray.sort(a,axis=-1,kind='quicksort',order=None)
  • a: 需要排序的数组;
  • axis: 沿着数组的方向排序,0表示按行,1表示按列;
  • kind: 排序的算法,提供了快排、混排、堆排;
  • order:如果数组包含字段,则是要排序的字段;
a = np.random.randn(5)
a.sort()
b = np.random.randn(4,5)
np.sort(b)
np.sort(b,axis=0) # 按列排序
返回值:
array([ 0.18443112, -1.38944051,  0.90415198, -0.71590079, -0.66183327])

array([-1.38944051, -0.71590079, -0.66183327,  0.18443112,  0.90415198])

array([[ 0.16560108, -0.21907392,  0.84871269,  1.89443371,  0.77757078],
       [ 1.67871265, -0.47794349,  0.19126643,  0.55254205, -0.57946957],
       [-1.20440916,  0.708059  ,  0.06512808,  0.02402871,  0.74404043],
       [-1.66396914,  0.47841347, -1.07146564,  1.21503792,  0.95665346]])
       
array([[-0.21907392,  0.16560108,  0.77757078,  0.84871269,  1.89443371],
       [-0.57946957, -0.47794349,  0.19126643,  0.55254205,  1.67871265],
       [-1.20440916,  0.02402871,  0.06512808,  0.708059  ,  0.74404043],
       [-1.66396914, -1.07146564,  0.47841347,  0.95665346,  1.21503792]])
       
array([[-1.66396914, -0.47794349, -1.07146564,  0.02402871, -0.57946957],
       [-1.20440916, -0.21907392,  0.06512808,  0.55254205,  0.74404043],
       [ 0.16560108,  0.47841347,  0.19126643,  1.21503792,  0.77757078],
       [ 1.67871265,  0.708059  ,  0.84871269,  1.89443371,  0.95665346]])

2. argsort函数

numpy.argsort函数返回的是数组从小到大的索引值,argsort的语法结构和参数说明与sort函数一致,其作用效果是对数组进行排序,返回一个排序后索引,数据没有改变。

c = np.array([2,1,5,8,-5,4])
c.argsort()
d = np.array([[1,5,3],[6,2,8],[3,6,0]])
np.argsort(d)
np.argsort(d,axis=0)
array([ 2,  1,  5,  8, -5,  4])
array([4, 1, 0, 5, 2, 3], dtype=int64)
array([[1, 5, 3],
       [6, 2, 8],
       [3, 6, 0]])
array([[0, 2, 1],
       [1, 0, 2],
       [2, 0, 1]], dtype=int64)       
array([[0, 1, 2],
       [2, 0, 0],
       [1, 2, 1]], dtype=int64)

3. Lexsort函数

numpy.lexsort用于对多个序列进行排序,排序时优先照顾靠后的列,比如我们查看某个班级的学生总成绩和数学课成绩,并对总成绩排序后,再对数学课成绩进行排序。

names = np.array(['Tom','Abe','Lily','Jane','Judy'])
ages = np.array([14,13,15,12,11])
totals_scores = np.array([190, 170, 168, 180, 176])
maths_scores = np.array([88,78,84,98,69])
index_lexsorted = np.lexsort((maths_scores, totals_scores))
names_lexsorted = names[np.lexsort((maths_scores, totals_scores))]
返回值:
array([2, 1, 4, 3, 0], dtype=int64)
array(['Lily', 'Abe', 'Judy', 'Jane', 'Tom'], dtype='<U4')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

他是只猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值