【numpy基础】--基础操作

numpy,基础,操作 · 浏览次数 : 41

小编点评

**numpy数组的基本操作** **1. 子数组** * 获取子数组的方法:`arr[start:stop:step]` * 提取已有数据的一部分来参与计算:`arr[start:stop:step]` **2. 数组副本当** * 创建子数组的副本:`arr2 = arr[::2]` * 修改原始数组:`arr2[2] = 99` **3. 数组变形** * 从一维变多维:`np.concatenate([arr1, arr2, arr3])` * 按照水平或垂直方向拼接:`np.vstack([arr1, arr2, arr3])` 和 `np.hstack([arr1, arr2, arr3])` **4. 拆分拆分** **4.1. 拆分** * 通过设置拆分点的下标,将数组拆分成任意长短的多个数组:`np.split(arr, [1, 5])` **4.2. 拆分** * 通过设置拆分点的下标,将数组拆分成任意长短的多个数组:`np.vsplit(arr, [1])` 和 `np.hsplit(arr, [1])` **5. 总结** * 提取子数组 * 创建数组副本 *变形数组 * 拆分数组

正文

numpy作为一个强大的数值计算库,提供了对多维数组的很多便捷操作。
承接上一篇数组的创建,本篇主要介绍一些数组的基本操作。

1. 子数组

首先介绍获取子数组的方法,提取已有数据的一部分来参与计算是比较常用的功能。

对于一维数组,提取子数组:arr[start:stop:step]

  1. start:从哪个下标开始(下标从 0 开始)
  2. stop:到哪个下标结束(下标不包括 stop 这个值)
  3. step:间隔几个元素
arr = np.array(range(10))  # 生成 0~9 10个元素
print(arr[::2]) # 偶数
print(arr[1::2]) # 奇数
print(arr[1:6:2]) # 前六个数中的奇数
print(arr[::-1]) # 逆序

#运行结果
[0 2 4 6 8]
[1 3 5 7 9]
[1 3 5]
[9 8 7 6 5 4 3 2 1 0]

对于多维数组,同样可以使用上面的方式,数组有几维,就可以使用几次 start:stop:step
比如下面的二维数组:

arr = np.array([range(6), range(1, 7),
                range(2, 8), range(3, 9),
                range(4, 10)])
print(arr)
#运行结果
[[0 1 2 3 4 5]
 [1 2 3 4 5 6]
 [2 3 4 5 6 7]
 [3 4 5 6 7 8]
 [4 5 6 7 8 9]]

print(arr[::2, ::2])
#运行结果
[[0 2 4]
 [2 4 6]
 [4 6 8]]

也就是按行取第 1,3,5行,然后按列取第 1,3,5列。

2. 数组副本

当我们提取子数组之后,如果对子数组进行修改,那么原始的数组也会变化。
这个因为数组是引用类型,当数组的数据量很大的时候,内存占用会比较低。
比如:

arr = np.array(range(5))
arr2 = arr[::2]
arr2[2] = 99

print(arr)
#运行结果
[ 0  1  2  3 99]

print(arr2)
#运行结果
[ 0  2 99]

子数组修改之后,原始数组也改变了。

如果要避免修改原始数组,就要建立子数组的副本,也就是 copy 方法。

arr = np.array(range(5))
arr2 = arr[::2].copy() # 通过copy方法建立副本
arr2[2] = 99

print(arr)
#运行结果
[0 1 2 3 4]

print(arr2)
#运行结果
[ 0  2 99]

3. 数组变形

进行数据分析时,我们常常得到的是线性的数据序列,也就是一维数组,
numpy中,从一维变到多维非常方便。

#一维变多维
arr = list(range(9))
print(arr)
#运行结果
[0, 1, 2, 3, 4, 5, 6, 7, 8]

arr = np.array(arr).reshape((3, 3))
print(arr)
#运行结果
[[0 1 2]
 [3 4 5]
 [6 7 8]]

注意,变换前后元素的总数量要一直,比如上面的例子中,
变换前一维数组有9个元素,变换成 3x3 的二维数组,也是9个元素。
如果变换成 3x4 或者 2x3 的二维数组,就会出错。

除了二维数组,变成三维数组也一样:

arr = np.array(range(24)).reshape((2, 3, 4))

print(arr)
#运行结果
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

4. 拼接和拆分

最后一个基本操作是数组的拼接拆分

4.1. 拼接

拼接有两个方向,水平拼接和垂直拼接,拼接的数组个数不限。
比如,下面的示例是3个数组拼接在一起。

arr1 = np.array([range(1, 4),
                 range(1, 4),
                 range(1, 4)])
arr2 = np.array([range(4, 7),
                 range(4, 7),
                 range(4, 7)])
arr3 = np.array([range(7, 10), 
                 range(7, 10),
                 range(7, 10)])

arr = np.concatenate([arr1, arr2, arr3])
print(arr)
#运行结果
[[1 2 3]
 [1 2 3]
 [1 2 3]
 [4 5 6]
 [4 5 6]
 [4 5 6]
 [7 8 9]
 [7 8 9]
 [7 8 9]]

arr = np.concatenate([arr1, arr2, arr3], axis=1)
print(arr)
#运行结果
[[1 2 3 4 5 6 7 8 9]
 [1 2 3 4 5 6 7 8 9]
 [1 2 3 4 5 6 7 8 9]]

concatenate 函数用来拼接数组,默认是垂直方向拼接,设置 axis=1,按照水平方向拼接。

如果觉得记参数麻烦,记不住哪个是水平拼接,哪个是垂直拼接,还有两个专门拼接的函数,
vstack(垂直拼接)和hstack(水平拼接)。

arr = np.vstack([arr1, arr2, arr3])
print(arr)
#运行结果
[[1 2 3]
 [1 2 3]
 [1 2 3]
 [4 5 6]
 [4 5 6]
 [4 5 6]
 [7 8 9]
 [7 8 9]
 [7 8 9]]

arr = np.hstack([arr1, arr2, arr3])
print(arr)
#运行结果
[[1 2 3 4 5 6 7 8 9]
 [1 2 3 4 5 6 7 8 9]
 [1 2 3 4 5 6 7 8 9]]

4.2. 拆分

拆分数组时,通过设置拆分点的下标,可以将数组拆分成任意长短的多个数组。
比如:

arr = np.array(range(1, 10))
arr1 = np.split(arr, [1, 5]) # 在下标 1 和 5 的地方拆分
print(arr1)
#运行结果
[array([1]), array([2, 3, 4, 5]), array([6, 7, 8, 9])]

上面的示例中,下标1对应的值是2下标5对应的值是6
2个拆分点,所以拆分成3个数组

同样,数组的拆分也有2个简便的方法:vsplithsplit
拆分多维数组时,可以按照垂直和水平两个方向拆分。

arr = np.array(range(1, 10)).reshape((3, 3))
print(arr)
#运行结果
[[1 2 3]
 [4 5 6]
 [7 8 9]]

print(np.vsplit(arr, [1]))
#运行结果
[array([[1, 2, 3]]), 
 array([[4, 5, 6],
       [7, 8, 9]])]

print(np.hsplit(arr, [1]))
#运行结果
[array([[1],
       [4],
       [7]]), 
 array([[2, 3],
       [5, 6],
       [8, 9]])]

垂直拆分时,拆分点是下标1的行,也就是从第二行开始拆分。
水平拆分时,拆分点是下标1的列,也就是从第二列开始拆分。

超过二维的数组也可以 vsplithsplit,只是结果看上去没那么直观。

5. 总结回顾

本篇主要介绍的是numpy数组的基本操作,包括:

  1. 提取子数组
  2. 创建数组副本
  3. 数组变形
  4. 拼接和拆分

这些基本操作是进行实际的数值计算前经常会使用到的。

与【numpy基础】--基础操作相似的内容:

【numpy基础】--基础操作

`numpy`作为一个强大的数值计算库,提供了对多维数组的很多便捷操作。 承接上一篇数组的创建,本篇主要介绍一些数组的基本操作。 # 1. 子数组 首先介绍获取子数组的方法,提取已有数据的一部分来参与计算是比较常用的功能。 对于一维数组,提取子数组:`arr[start:stop:step]` 1.

【numpy基础】--目录(完结)

# 概述 NumPy是一个开源的科学计算库,它提供了高效的数值计算和数组操作功能,主要包括: * 多维数组的创建、操作和索引。 * 数组的切片、拼接和转置。 * 数组的乘法、除法、求导、积分、对数等基本运算。 * 数组的逐元素操作、求平均值、中位数、众数等统计量。 * 数组作为列表、元组等数据类型进

【numpy基础】--数组简介

`NumPy`(Numerical Python)是一个`Python`库,主要用于高效地处理多维数组和矩阵计算。它是科学计算领域中使用最广泛的一个库。 在`NumPy`中,**数组**是最核心的概念,用于存储和操作数据。 `NumPy`数组是一种多维数组对象,可以存储相同类型的元素,它支持高效的数

【numpy基础】--通用计算

`numpy`提供了简单灵活的接口,用于优化数据数组的计算。 通用计算最大的优势在于通过向量化操作,将循环推送至`numpy`之下的编译层,从而取得更快的执行效率。 `numpy`的通用计算让我们计算数组时就像计算单独一个变量一样, 不用写循环去遍历数组中的各个元素。 比如,对于一般的`python

Pandas 使用教程 Series、DataFrame

[TOC] Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算) Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。 Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工

【pandas基础】--概述

Pandas是一个开源的Python数据分析库。 它提供了快速,灵活和富有表现力的数据结构,旨在使数据清洗和分析变得简单而快速。 Pandas是基于NumPy数组构建的,因此它在许多NumPy函数上提供了直接的支持。它还提供了用于对表格数据进行操作的数据结构,例如Series和DataFrame。

NumPy(1)-常用的初始化方法

一、NumPy介绍 NumPy是Python中科学计算的基础包,它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。 功能强大的N维数

pandas(进阶操作)-- 政治献金项目数据分析

博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jupyter anaconda提供的一个基于浏览器的可视化开发工具 import numpy as np

pandas(进阶操作)-- 处理非数值型数据 -- 数据分析三剑客(核心)

博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jupyter anaconda提供的一个基于浏览器的可视化开发工具 import numpy as np

【numpy基础】--聚合计算

上一篇介绍的**通用计算**是关于多个`numpy`数组的计算, 本篇介绍的**聚合计算**一般是针对单个数据集的各种统计结果,同样,使用**聚合函数**,也可以避免繁琐的循环语句的编写。 # 元素的和 数组中的元素求和也就是合计值。 ## 调用方式 **聚合计算**有两种调用方式,一种是面向对象的