Python|NumPy的常用操作

简介: Python|NumPy的常用操作

什么要用Numpy

Python中常用的基本数据结构有很多,通常我们在进行简单的数值存储的时候都会使用list来进行,但是list的缺点在于对于每一个元素都需要有指针和对象,对于数值运算来说,list显然是比较浪费内存和CPU计算时间的。为了弥补这种结构的不足,Numpy诞生了,在Numpy中提供了两种基本的对象:ndarray和ufunc。ndarray是存储单一数据类型的多维数组,ufunc则是能够对数组进行处理的函数。


Numpy的主要特点

具有运算快,节约空间的ndarray,提供数组化的算数运算和高级的广播功能;

使用标准数学函数对整个数组的数据进行快速运算,不需传统的循环编写;

读取/写入磁盘上的阵列数据和操作存储器映像文件的工具;

线性代数,随机数生成,以及傅立叶变换的能力;


生成ndarray的几种方式

从已有数据中创建

# 将列表转换成ndarray
import numpy as np
list1 = [1.1, 2.2, 3, 4, 5]
nd1 = np.array(list1)
print(type(nd1))
print(list1)
<class 'numpy.ndarray'>
[1.1, 2.2, 3, 4, 5]
# 嵌套列表转换成多维ndarray
list2 = [[1.1, 2.2, 3, 4, 5],[7.7, 8.8, 9, 10, 11]]
nd2 = np.array(list2)
print(type(nd2))
print(list2)
<class 'numpy.ndarray'>
[[1.1, 2.2, 3, 4, 5], [7.7, 8.8, 9, 10, 11]]

利用random模块生成ndarray

在numpy的random模块中提供了多种生成随机数的函数,常用的几种如下:


  • random() 生成0到1之间的随机数;
  • uniform() 生成均匀分布的随机数;
  • randn() 生成标准正态的随机数;
  • normal() 生成符合正态分布的随机数;
  • shuffle() 随机打乱数据的顺序;
  • seed() 设置随机数种子


# 使用random生成随机数
import numpy as np
nd3 = np.random.random((2, 3))
print(type(nd3))
print(nd3)
<class 'numpy.ndarray'>
[[0.56190317 0.17571506 0.73992818]
 [0.61694656 0.84881069 0.47786533]]

创建特殊的多维数组

import numpy as np
# 创建0矩阵
nd4 = np.zeros((3, 3))
# 创建全1矩阵
nd5 = np.ones((3, 3))
# 创建单位矩阵
nd6 = np.eye(3)
nd7 = np.identity(3)
# 创建对角矩阵:主对角线之外的元素都为0
nd8 = np.diag((1, 2, 3, 4))
# 创建对称矩阵
X = np.mat([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
A = np.triu(X)  # 用于提取主对角线元素
nd9 = A + A.T - np.diag((np.diagonal(X)))
print(nd9)
[[1 2 3]
 [2 5 6]
 [3 6 9]]
# np中还提供了函数可以让我们把生成的数据存储成文件,并通过读取的方式加载数据
import numpy as np
nd10 = np.random.random((3, 3))
np.savetxt(X=nd10, fname='./test.txt')
nd11 = np.loadtxt('./test.txt')
print(nd11)
[[0.24245307 0.61346602 0.38558164]
 [0.77844911 0.22011088 0.54350789]
 [0.34898106 0.12912724 0.65936827]]

通过循环的方式创建数组

numpy中提供了arange函数使得我们可以通过循环的方式设置起始位置以及步长来生成数组。

nd12 = np.arange(1, 10, 1)
print(nd12)
[1 2 3 4 5 6 7 8 9]

元素的存取

import numpy as np
# 一维数组的截取
nd13 = np.random.random((10))
# 获取指定位置的数据
nd13[4]
# 获取一段数据
nd13[4:8]
# 根据步长获取数据
nd13[4:8:2]
# 多维数组的截取
nd14 = np.random.random((5, 5))
# 获取指定位置的数据
nd14[2, 4]
# 获取指定区域的数据
nd14[1:4, 1:4]
# 根据数值截取数据
nd14[(nd14 > 0.4) & (nd14 < 0.8)]
# 获取指定的行和列
print(nd14[:, 3])  # 列
print(nd14[3, :])  # 行
[0.8820414  0.63166344 0.88848099 0.91915532 0.38583446]
[0.36635677 0.89179454 0.69437534 0.91915532 0.29375765]

我们除了可以通过指定索引获取数据外,还可以使用choice()函数来随机抽取数据


矩阵的运算

numpy中的linalg模块中提供了很多矩阵运算的函数,主要的函数如下:


  • diag():以一维数组的方式返回方阵的对角线元素
  • dot():矩阵乘法
  • trace():求矩阵的迹(对角线元素的和)
  • det():计算矩阵列式
  • eig():计算方阵的特征值和特征向量
  • inv():计算方阵的逆
  • qr():计算qr分解
  • svd():计算奇异值分解svd
  • solve():解线性方程组Ax=b,其中A为矩阵
  • lstsq():Ax=b的最小二乘法求解


数据的合并与展开

在实际应用中我们经常会遇到需要把数据进行合并和展开的情况,接下来让我们看一下如何进行操作。

一维数组的合并

import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 使用append函数进行合并
c = np.append(a, b)
# 使用concatenate函数进行合并
d = np.concatenate((a, b))
print(c)
print(d)
[1 2 3 4 5 6]
[1 2 3 4 5 6]

多维数组的合并

import numpy as np
a = np.arange(4).reshape(2, 2)
b = np.arange(4).reshape(2, 2)
# 按行合并
c = np.append(a, b, axis=0)
# 按列合并
d = np.append(a, b, axis=1)
print(c)
print(d)
[[0 1]
 [2 3]
 [0 1]
 [2 3]]
[[0 1 0 1]
 [2 3 2 3]]

矩阵展开

import numpy as np
nd = np.arange(6).reshape(2, -1)
# 按照列展开
nd1 = nd.ravel("F")
# 按照行展开
nd2 = nd.ravel()
print(nd1)
print(nd2)
[0 3 1 4 2 5]
[0 1 2 3 4 5]

常用的数学函数

numpy中也提供了大量的数学函数,并且这些函数的运行速度要比math等库中的函数快很多(具体快多少可以自己实践证明一下),常用的数学函数如下:


  • sqrt():计算序列化数据的平方根
  • sin(),cos():三角函数
  • abs():计算序列化数据的绝对值
  • dot():矩阵运算
  • log(),log10(),log2():对数函数
  • exp():指数函数
  • cumsum(),cumproduct():累计求和,求积
  • sum():对一个序列化数据进行求和
  • mean():计算均值
  • median():计算中位数
  • std():计算标准差
  • var():计算方差
  • corrcoef():计算相关系数


广播机制

我们都知道,在进行数学运算的时候,不同形状的矩阵不能进行加减的运算,但是numpy中提供的广播机制让我们能够对不同形状的矩阵进行运算,广播的兼容原则为:


  • 对齐尾部维度
  • shape相等或者其中shape元素中有一个为1


import numpy as np
a = np.arange(10).reshape((5,2))
b = np.arange(2).reshape((1,2))
print(a+b)
[[ 0  2]
 [ 2  4]
 [ 4  6]
 [ 6  8]
 [ 8 10]]


相关文章
|
16小时前
|
存储 机器学习/深度学习 数据处理
NumPy:从初识到实战,探索Python科学计算的无限可能
NumPy:从初识到实战,探索Python科学计算的无限可能
38 0
|
16小时前
|
SQL 数据采集 数据挖掘
构建高效的Python数据处理流水线:使用Pandas和NumPy优化数据分析任务
在数据科学和分析领域,Python一直是最受欢迎的编程语言之一。本文将介绍如何通过使用Pandas和NumPy库构建高效的数据处理流水线,从而加速数据分析任务的执行。我们将讨论如何优化数据加载、清洗、转换和分析的过程,以及如何利用这些库中的强大功能来提高代码的性能和可维护性。
|
16小时前
|
存储 测试技术 程序员
【Python】—— NumPy基础及取值操作
【Python】—— NumPy基础及取值操作
6 1
|
16小时前
|
索引 Python
【Python】—— Numpy 初体验
【Python】—— Numpy 初体验
3 0
|
16小时前
|
机器学习/深度学习 TensorFlow 算法框架/工具
Python深度学习基于Tensorflow(1)Numpy基础
Python深度学习基于Tensorflow(1)Numpy基础
17 5
|
16小时前
|
数据采集 Web App开发 数据可视化
Python爬虫技术与数据可视化:Numpy、pandas、Matplotlib的黄金组合
Python爬虫技术与数据可视化:Numpy、pandas、Matplotlib的黄金组合
|
16小时前
|
存储 数据挖掘 vr&ar
深入探索Numpy--索引,切片,随机数,文本操作等
深入探索Numpy--索引,切片,随机数,文本操作等
|
16小时前
|
数据挖掘 数据处理 索引
Python数据分析面试:NumPy基础与应用
【4月更文挑战第16天】了解并熟练运用NumPy是衡量Python数据分析能力的关键。本文探讨了面试中常遇到的NumPy问题,包括数组创建、属性、索引切片、数组运算、统计函数以及重塑和拼接,并提供了相关代码示例。同时强调了易错点,如混淆Python列表与NumPy数组、误解广播规则等,提醒在数据处理中注意性能和内存效率。掌握这些知识点将有助于提升数据分析面试表现和技能。
33 5
|
16小时前
|
存储 数据挖掘 数据处理
Python中数据分析工具NumPy
【4月更文挑战第14天】NumPy是Python的数值计算扩展库,专注于处理大型多维数组和矩阵。其主要特性包括ndarray对象(存储同类型元素的高效数据容器)、广播机制(处理不同形状数组运算)、线性代数与统计函数、随机数生成及与C/C++/Fortran代码集成。作为Pandas等数据分析工具的基础,掌握NumPy对提升数据处理能力至关重要。
9 1
|
16小时前
|
Python
用Python的Numpy求解线性方程组
用Python的Numpy求解线性方程组