NumPy学习教程

本文是Python数据分析系列内容,介绍了NumPy数组。NumPy能高效存储和操作数据,是Python数据科学工具生态核心。文章从创建ndarray开始,详细阐述了查看数组属性、索引和切片、运算、合并和拆分等基本操作,还提及了广播规则等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python数据分析系列

文章目录

 


前言

NumPy (Numerical Python的简称)提供了一个有效的接口来存储和操作密集的数据缓冲区。在某些方面,NumPy数组类似于Python的内置列表类型,但随着数组的规模越来越大,NumPy数组提供了更高效的存储和数据操作。NumPy数组构成了Python中几乎整个数据科学工具生态系统的核心,因此,学习Numpy是Python数据分析的基础。       

Python用户经常被其易用性所吸引,其中一个特点就是动态类型。不同于C或Java这样的静态类型语言需要显式声明每个变量,Python这样的动态类型语言不需要这一步。在Python中,数据类型是动态推断的,这意味着,我们可以将任何类型的数据赋值给任何变量。这种灵活型使得Python和其他动态类型语言使用简单,但是也反映了一个事实:Python变量不仅仅是它们的值,而且还包含了关于值类型的额外信息。

以一个Python整型为例,当我们在Python中定义一个整型时,它实际上是一个指向复合的C结构的指针,包括了引用计数、变量类型、数据大小和数值四个部分。

Python变量的这些附加信息使得Python可以自由、动态地编码,然而,这种灵活性是有代价的。特别地,在所有变量都是相同类型的情况下,大部分信息都是多余的:将数据存储在固定类型的数组中会更有效。Numpy数组的提出正好解决了这个问题,固定数据类型使其缺乏了上述的灵活性,但在存储和操作数据方面要高效得多。

以下主要从numpy数组的创建和基本操作进行展开。


首先,导入numpy库:

import numpy as np 

一、创建ndarray

从一个Python列表中创建数组,使用np.array()函数。

# 一维数组
data1 = [6,7.5,8,0,1]
arr1 = np.array(data1)
arr1

​# 二维数组
​data2 = [[1,2,3,4],[5,6,7,8]]
arr2 = np.array(data2)
arr2

利用内置函数,创建特殊数组。

# 创建全0数组
np.zeros(10)
np.zeros((3,6))
# 创建全1数组
np.ones(10)
# 创建元素相同的数组
np.full((3,5),3.14)
# 创建一个没有任何具体值的数组
np.empty((2,3,2))
# 创建等差数组
np.arange(15)
# 创建0到1等距数组
np.linspace(0,1,5)
# 创建随机数组
np.random.random((3,3))

二、基本操作

1. 查看数组属性

使用dtype方法查看数组类型

arr1 = np.array([1,2,3],dtype=np.float64)
arr1.dtype

使用as.type方法修改数组类型:

float_arr = arr1.astype(np.float64)
float_arr.dtype

使用ndim方法查看多维数组的大小、shape方法查看多维数组的维度

data2 = [[1,2,3,4],[5,6,7,8]]
arr2 = np.array(data2)
arr2.ndim
arr2.shape

使用reshape方法修改数组的维度:

arr = np.arange(32).reshape((8,4))
arr

对数据进行转置:

# 二维数组
arr.T
# 多维数组
arr = np.arange(16).reshape((2,2,4))
# 第一个轴被换成了第二个,第二个轴被换成了第一个,最后一个轴不变。
arr.transpose((1,0,2))
# 第三个轴不变,第一个轴和第二个轴互换
arr.swapaxes(1,2)

2.数组索引和切片

2.1 基本索引和切片

基本索引和切片操作类似于列表的索引和切片操作,注意数组切片是原始数组的视图,这意味着数据不会被复制,视图上的任何修改都会直接反映到原数组上。

# 创建一维数组
arr = np.arange(10)
arr
# 查看索引为5的值
arr[5]
# 查看切片[5,8)的值
arr[5:8]
# 部分元素赋值
arr[5:8] = 12
# 创建二维数组
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2d
# 返回第三行数据
arr2d[2]
# 检索具体某个值
arr2d[0][2]
arr2d[0,2]
# 返回前两行后两列数据
arr2d[:2,1:]

2.2 布尔型索引

注意的是布尔型索引选取数组中的数据,总是创建数据的副本。

假设每一行是对应同学的消费记录,查找‘bob’同学的所有消费记录:

names = np.array(['bob','joe','will','bob','will','joe','joe'])
data = np.random.randn(7,4)
data[names=='bob']

查找不是‘bob’同学的所有消费记录:

data[~(names=='bob')]
# 或者
data[names != 'bob']

查找'bob'和'will'两位同学的所有消费记录:

mask = (names == 'bob') | (names == 'will')
data[mask]

也可进行赋值:

data[data<0] = 0

将条件逻辑表述为数组运算:

# 条件满足,则为2,否则为-2
np.where(data>0,2,-2)

用于布尔型数组的方法:

arr = np.random.randn(100)
(arr>0).sum()
bools = np.array([False,False,True,False])
bools.any()
bools.all()

2.3 花式索引

花式索引跟切片不一样,它总是将数据复制到新数组中。

# 创建数组
arr = np.empty((8,4))
for i in range(8):
    arr[i] = i
arr
# 花式索引
arr[[4,3,0,6]]
arr[[-3,-5,-7]]
arr[[1,5,7,2]][:,[0,3,1,2]]

3.数组的运算

同维度向量之间、向量与标量之间进行矢量化运算;不同维度向量之间进行广播运算。

# 创建数组
arr = np.array([[1.,2.,3.],[4.,5.,6.]])
arr
# 基本代数运算
arr * arr
arr - arr
1/ arr
arr ** 0.5
arr > 3

3.1 数组的通用函数

一般的函数都可使用:

arr = np.arange(10)
# 开方
np.sqrt(arr)
# 指数
np.exp(arr)
# 均值
np.mean(arr)

数组排序:

arr = np.random.randn(5,3)
arr
# 每行排序
arr.sort(1)

np.sort返回的是数组的已排序副本,而方法.sort()则会修改数组本身。

值得注意的是在numpy中,axis=0、axis=1分别表示的是行和列,但是在进行处理时,是对这两个方向的数据进行操作,区别于实际结果的输出方向。

3.2 数组的广播

NumPy中的广播遵循一组严格的规则来确定两个数组之间的交互:

  • 规则1:如果两个数组的维数不同,维数较少的数组的形状在其前导(左)边填充
M = np.ones((2,3))
a = np.arange(3)
# 返回一个(2,3)数组
M + a
  • 规则2:如果两个数组的形状在任何维度上都不匹配,那么在该维度上大小等于1的数组将被拉伸以匹配另一个形状。
a = np.arange(3).reshape((3,1))
b = np.arange(3)
# 返回(3,3)维数组
a + b
  • 规则3:如果在任何维度的大小不一致,且任何维度都不等于1,将会报错。
M = np.ones((3,2))
a = np.arange(3)
# 报错
M + a

4.数组的合并和拆分

一维数组合并:

x = np.array([1,2,3])
y = np.array([3,2,1])
# 两个数组合并
np.concatenate([x,y])

多维数组合并:

grid = np.array([[1,2,3],
                 [4,5,6]])
# 按照第一个坐标合并
np.concatenate([grid,grid])
# 按照第二个坐标合并
np.concatenate([grid,grid],axis=1)

在处理不同维数组时,使用np.vstack(垂直)和np.hstack(水平)函数更清晰:

x = np.array([1,2,3])
grid = np.array([[9,8,7],[6,5,4]])
# 按行合并
np.vstack([x,grid])
y = np.array([[99],
             [99]])
# 按列合并
np.hstack([grid,y])

数组拆分的函数有np.split、np.hsplit(按垂直方向)、np.vsplit(按水平方向):

x = [1,2,3,99,99,3,2,1]
# 需要传人拆分点
x1 ,x2 ,x3 = np.split(x,[3,5])
print(x1,x2,x3)
grid = np.arange(16).reshape((4,4))
grid
upper,lower = np.vsplit(grid,[2])
left,right = np.hsplit(grid,[2])

总结

以上就是今天要讲的内容,本文仅仅简单介绍了numpy的使用,更多的函数和方法需要大家在实践中积累哦~

参考文献:

《利用python进行数据分析(第二版)》

《python data science handbook》

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值