【数据分析之Numpy基础003】数组形状大变身!轻松掌握改变数组形状的技巧

        处理数组的一项重要工作就是改变数组的维度,包括提高数组的维度和降低数组的维度,还包括数组的转置、拼接、分隔等。

        Numpy为大家提供了大量的API可以很轻松的完成这些数组的操作。

1、改变数组的维度

        如上篇文章使用到的reshape方法,将一维数组转化成多维数组;ravel方法或flatten方法将多维数组转化为一维数组。还可以直接设置ndarray的shape属性,通过resize方法也可以改变数组的维度。

例:

# 改变数组的维度

import numpy as np

# 创建一维数组

arr = np.arange(32)

print('arr:', arr)

print('arr的维度为', arr.shape)

# 使用reshape方法将一维数组转为多维数组

arr_mult = arr.reshape(4,2,4)

print('arr_mult:', arr_mult)

print('arr_mult的维度为', arr_mult.shape)

# 转为二维数组

arr_two = arr.reshape(4,8)

print('arr_two:', arr_two)

print('arr_two的维度为', arr_two.shape)

# 使用 ravel 函数将三维的 arr_mult 变成一维的数组

arr_one = arr_mult.ravel()

print('arr_one:', arr_one)

# 使用 flatten 函数将二维的 arr_two 变成一维的数组

arr_one1 = arr_two.flatten()

print('arr_one1:', arr_one1)

2、数组的拼接

        数组的拼接分为水平拼接垂直拼接

        对于一维或多维数组来说,水平拼接就是列拼接,改变列数不改变行数,垂直拼接就是就是行拼接,改变行数不改变列数。

        需要注意的是:

        1)水平拼接必须要满足一个条件,就是所有参与水平拼接的数组的行数必须相同,否则进行水平拼接会抛出异常。垂直拼接同理。

        2)多维数组拼接时,需要相同类型的数组才可以拼接,否则会抛出异常。

        (1)一维数组水平拼接

        通过hstack函数可以将两个或多个数组水平拼接成一个数组

例:

import numpy as np

arr1 = np.arange(6).reshape(2,3)

print('arr1:', arr1)

arr2 = np.arange(6, 12).reshape(2,3)

print('arr2:', arr2)

arr_conca = np.hstack([arr1, arr2])

print('arr_conca:', arr_conca)

        (2)一维数组垂直拼接

        通过vstack函数可以将两个或多个数组垂直拼接成一个数组

例:

import numpy as np

arr1 = np.arange(6).reshape(2,3)

print('arr1:', arr1)

arr2 = np.arange(6, 12).reshape(2,3)

print('arr2:', arr2)

arr_conca = np.vstack([arr1, arr2])

print('arr_conca:', arr_conca)

 

        (3)concatenate 函数

        numpy还是提供了concatenate 函数用于沿指定轴拼接相同形状的多个数组,具体语法如下:

numpy.concatenate((a1, a2, ...), axis)

        其中:参数a1,a2,...指相同类型的数组;axis指沿着它连接数组的轴,默认为0(垂直方向)

例:

arr1 = np.arange(6).reshape(2,3)

print('arr1:', arr1)

arr2 = np.arange(6, 12).reshape(2,3)

print('arr2:', arr2)

arr_conca = np.concatenate([arr1, arr2])

print('arr_conca:', arr_conca)

arr_conca1 = np.concatenate([arr1, arr2],axis=0)

print('垂直拼接:', arr_conca1)

arr_conca2 = np.concatenate([arr1, arr2],axis=1)

print('水平拼接:', arr_conca2)

 

        (4)多维数组的拼接

arr_thr1 = np.arange(24).reshape(2, 3, 4)

print('arr_thr1:', arr_thr1)

arr_thr2 = np.arange(8, 24).reshape(2, 2, 4)

print('arr_thr2:', arr_thr2)

arr_thr3 = np.arange(16).reshape(2, 2, 4)

print('arr_thr3:', arr_thr3)

print('三维数组水平拼接'.center(30, '-'))

arr_conca_h_thr = np.hstack([arr_thr1, arr_thr2])

print('三维数组水平拼接arr_conca_h_thr:', arr_conca_h_thr)

print('三维数组arr_conca_h_thr的形状:', arr_conca_h_thr.shape)

print('三维数组垂直拼接'.center(30, '-'))

arr_conca_v_thr = np.vstack([arr_thr2, arr_thr3])

print('三维数组垂直拼接arr_conca_v_thr:', arr_conca_v_thr)

print('三维数组arr_conca_v_thr的形状:', arr_conca_v_thr.shape)

print('三维数组水平拼接'.center(30, '-'))

arr_conca_h_thr1 = np.concatenate([arr_thr1, arr_thr2], axis=1)

print('三维数组水平拼接arr_conca_h_thr1:', arr_conca_h_thr1)

print('三维数组arr_conca_h_thr1的形状:', arr_conca_h_thr1.shape)

 

3、数组的分隔

        分隔数组是拼接数组的逆过程,与拼接数组一样,分隔数组也分为水平分隔数组和垂直分隔数组。水平分隔数组与水平拼接数组对应。水平拼接数组是将两个或多个数组水平进行收尾相接,而水平分隔数组是将已经水平拼接到一起的数组再分开。

        在numpy中,常常使用numpy.split函数指定分隔的轴来分割数组。

        其语法格式如下:

numpy.split(array, indices_or_sections, axis)

其中:

        array:被分隔的数组

        indices_or_sections:如果是一个整数,就用该数平均切分,如果是一个数组,就为沿轴切分的位置(索引号)

        axis:沿着哪个维度进行切分,默认为0, 横向切分;为1时,纵向切分

例:

        分隔一维数组

# 数组分隔

x = np.arange(8)

# 传递整数进行分隔

arr = np.split(x, 4)

print('arr:', arr)

print('arr[0]:', arr[0])

print('arr[1]:', arr[1])

print('arr[2]:', arr[2])

print('arr[3]:', arr[3])

# 传递数组进行分隔

arr1 = np.split(x,[2,4])

print('arr1:', arr1)

 

        分隔二维数组

# 二维数组分隔

x = np.arange(12).reshape(4, 3)

print('x:', x)

# 沿垂直方向,平均分隔

arr = np.split(x, 2, axis=0)

print('arr[0]:', arr[0])

print('arr[1]:', arr[1])

# 沿水平方向,按位置分隔

arr1 = np.split(x, [1], axis=1)

print('arr1:', arr1)

 

        (1)水平分隔

        numpy也单独提供了水平分隔与垂直分隔的函数,分别为hsplit()与vsplit()。话不多说,直接上代码。

x = np.arange(12).reshape(3, 4)

print('x:', x)

arr = np.hsplit(x, 2)

print('arr[0]:', arr[0])

print('arr[1]:', arr[1])

 

        (2)垂直分隔

x = np.arange(12).reshape(4, 3)

print('x:', x)

arr = np.vsplit(x, [2])

print('arr[0]:', arr[0])

print('arr[1]:', arr[1])

arr1 = np.vsplit(x, [1, 3])

print('位置1的数组')

print(arr1[0])

print('位置3的数组')

print(arr1[1])

 

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值