目录
一、NumPy概述
二、NumPy数据类型
三、创建数组
1. numpy.array函数创建数组
2. np.arange创建数组
3. numpy.random.rand创建数组
4. numpy.random.randint创建数组
5. NumPy创建特殊数组
四、数组的属性
五、NumPy数组索引与切片
一、NumPy概述
NumPy(Numerical Python的简称)是一个开源的Python科学计算库,用于对多维数组进行快速操作以及与其相关的数学运算。它是由Travis Oliphant于2005年创建的,旨在通过提供大量的数学和统计工具,满足科学家、工程师和数据分析师在Python编程中高效处理数据的需求,NumPy本身并没有提供很多高级的数据分析功能,许多其他的数据科学工具都是基于 NumPy 开发的,理解NumPy数组以及面向数组的计算将有助于你更加高效地使用诸如pandas之类的工具。
NumPy库特点:
- ndarray:NumPy的核心数据结构是ndarray(N-dimensional array,多维数组),存储相同类型的元素。
- 数组操作:NumPy的数组操作包括算术运算、逻辑运算、线性代数运算、统计运算......
- 数学函数库:NumPy包含了大量的数学函数,包括三角函数、指数和对数函数、线性代数函数、随机数生成函数......
- 广播(Broadcasting):广播允许不同形状的数组直接进行算术运算,避免了显示循环,提高代码效率。
- 索引和切片:类似Python的列表和C语言的多维数组进行索引和切片。
NumPy数组和Python列表的区别:
- NumPy数组中的所有元素都是相同类型的
- NumPy数组效率远高于Python列表
- NumPy数组提供了全面的数学函数可以直接对多维数组进行运算
二、NumPy数据类型
Python 原生的数据类型相对较少, bool、int、float、str等。这在不需要关心数据在计算机中表示的所有方式是方便的。但是,对于科学计算,通常需要更多的控制。
NumPy支持的数据类型比Python内置的类型要多很多,这其中部分类型与Python内置的类型是一样的,为了加以区分,NumPy在与Python相同的数据类型名称末尾都加了“_”。
类型 | 备注 | 说明 |
bool_ | 8位 | 布尔类型 |
int8 | 8位 | 整型(-128 to 127) |
int16 | 16位 | 整型(-32768 to 32767) |
int32 | 32位 | 整型(-2147483648 to 2147483647) |
int_ | 64位 | 整型(-9223372036854775808 to 9223372036854775807) |
uint8 | 8位 | 无符号整型(0 to 255) |
uint16 | 16位 | 无符号整型(0 to 65535) |
uint32 | 32位 | 无符号整型(0 to 4294967295) |
uint64 | 64位 | 无符号整型(0 to 18446744073709551615) |
float16 | 16位 | 浮点型 |
float32 | 32位 | 浮点型 |
float_ | 64位 | 浮点型 |
str_ | Unicode字符串 | |
datetime64 | 日期时间 | |
timedelta64 | 时间间隔 |
每个内置类型都有一个唯一定义它的字符代码:
字符 | 对应类型 | 备注 |
b | boolean | 'b1' |
i | signed integer | 'i1', 'i2', 'i4', 'i8' |
u | unsigned integer | 'u1', 'u2' ,'u4' ,'u8' |
f | floating-point | 'f2', 'f4', 'f8' |
c | complex floating-point | |
m | timedelta64 | 表示两个时间之间的间隔 |
M | datetime64 | 日期时间类型 |
O | object | |
S | (byte-)string | S3表示长度为3的字符串 |
U | Unicode | Unicode 字符串 |
V | void |
示例:
import numpy as np
a = np.dtype('b1')
print(a.type) # <class 'numpy.bool_'>
a = np.dtype('i4')
print(a.type) # <class 'numpy.int32'>
a = np.dtype('i8')
print(a.type) # <class 'numpy.int64'>
a = np.dtype('u2')
print(a.type) # <class 'numpy.uint16'>
a = np.dtype('u8')
print(a.type) # <class 'numpy.uint64'>
a = np.dtype('f4')
print(a.type) # <class 'numpy.float32'>
a = np.dtype('f8')
print(a.type) # <class 'numpy.float64'>
a = np.dtype('S')
print(a.type) # <class 'numpy.bytes_'>
a = np.dtype('S3')
print(a.type) # <class 'numpy.bytes_'>
a = np.dtype('U3')
print(a.type) # <class 'numpy.str_'>
NumPy常量:
- 【numpy.nan】:表示空值,nan = NaN = NAN,numpy.isnan() 判断是否为空
- 【numpy.inf】:表示正无穷大(负的无穷大:-np.inf),numpy.isinf() 判断是否是正负无穷大
- 【numpy.pi】:表示圆周率,3.14
- 【numpy.e】:表示自然常数,2.71
import numpy as np
a = np.array([1, np.nan, 3, np.inf, 5, np.pi, 7, np.e])
np.isnan(a)
# array([False, True, False, False, False, False, False, False])
np.isinf(a)
# array([False, False, False, True, False, False, False, False])
三、创建数组
NumPy最重要的一个特点就是其N维数组对象(即ndarray),它是 python 中 list 的扩展,是一个快速而灵活的大数据集容器。
1. numpy.array函数创建数组
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
参数名称 | 描述 |
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
import numpy as np
# 创建一维数组
a1 = np.array([1, 2, 3])
# array([1, 2, 3])
# 创建二维数组
a2 = np.array([[1, 2, 3], [4, 5, 6]])
# array([[1, 2, 3],
# [4, 5, 6]])
# 创建三维数组
a3 = np.array([[[1, 2, 3],
[4, 5, 6]],
[[7, 8, 9],
[10, 11, 12]]])
# array([[[ 1, 2, 3],
# [ 4, 5, 6]],
#
# [[ 7, 8, 9],
# [10, 11, 12]]])
# 查看数组形状
print(np.shape(a1), np.shape(a2), np.shape(a3))
print(a1.shape, a2.shape, np.shape(a3))
# (3,) (2, 3) (2, 2, 3)
# 查看数组维度
print(np.ndim(a1), np.ndim(a2), np.ndim(a3))
print(a1.ndim, a2.ndim, a3.ndim)
# 1 2 3
2. np.arange创建数组
numpy.arange(start, stop, step, dtype=None)
- start:起始数字,默认为0
- stop:结束数字
- step:步长,默认为1
- dtype:指定数据类型
import numpy as np
a1 = np.arange(5)
print(a1) # [0, 1, 2, 3, 4]
a2 = np.arange(2, 8)
print(a2) # [2 3 4 5 6 7]
a3 = np.arange(2, 10, 2)
print(a3) # [2 4 6 8]
a4 = np.arange(2, 10, 3, float)
print(a4) # [2. 5. 8.]
3. numpy.random.rand创建数组
numpy.random.rand(d0,d1,…,dn)
- 创建数组,返回一个由[0,1)内的随机数组成的数组
- d0,d1,...dn: 数组的维度
import numpy as np
a1 = np.random.rand(5)
print(a1)
# [0.52096722 0.79390646 0.67468159 0.28415768 0.4231725 ]
a2 = np.random.rand(2, 3)
print(a2)
# [[0.80116637 0.25449359 0.32428079]
# [0.77801779 0.04284573 0.58361303]]
4. numpy.random.randint创建数组
numpy.random.randint(low, high=None, size=None, dtype=’l’)
创建数组,返回随机整数或整型数组,范围区间为 [low, high)
- low:最小值,如果没有指定high这个参数,则low为生成的元素值的最大值
- high:最大值
- size:数组维度大小
- dtype:数据类型,默认的数据类型是np.int
import numpy as np
a1 = np.random.randint(5)
# 返回 0 ~ 5 之间的随机数
a2 = np.random.randint(2, 5, size=(2, 3))
# 返回形状为(2, 3)的数组,每个元素的值为 2 ~ 5
5. NumPy创建特殊数组
全0、全1数组:
numpy.zeros(shape, dtype=None, order='C')
numpy.ones(shape, dtype=None, order='C')
- order:在计算机内存中存储元素的顺序,“C”行优先,“F”列优先
import numpy as np
a1 = np.zeros(2)
print(a1) # [0. 0.]
# 返回两个元素为0的一维数组
a2 = np.zeros((2, 3), dtype=int)
print(a2)
# [[0 0 0]
# [0 0 0]]
a3 = np.ones((3, 2), dtype=int)
print(a3)
# [[1 1]
# [1 1]
# [1 1]]
单位数组:返回一个对角线上为1,其它地方为零的单位数组。
numpy.eye(N, M=None, k=0, dtype=float, order='C')
参数 | 描述 |
N | 返回数组的行数,int |
M | 输出中的列数。如果没有,则默认为 N 。可选 |
k | 对角线的索引:0(默认)表示主对角线,正值表示上对角线,负值表示下对角线。可选 |
dtype | 返回数组的数据类型。可选 |
order | 在计算机内存中的存储元素的顺序,"C"行优先,"F"列优先。可选 |
import numpy as np
a1 = np.eye(3)
print(a1)
# [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
a2 = np.eye(4, dtype=int)
print(a2)
# [[1 0 0 0]
# [0 1 0 0]
# [0 0 1 0]
# [0 0 0 1]]
常数数组:
numpy.full(shape, fill_value, dtype=None, order='C')
- shape:数组形状,参数值可以是int,int元组,int列表
- fill_value:填充值
import numpy as np
arr1 = np.full([2,3], 4)
print(arr1)
# [[4, 4, 4],
# [4, 4, 4]]
arr2 = np.full([3, 3], True)
print(arr2)
# [[ True True True]
# [ True True True]
# [ True True True]]
等差数列数组:生成一个指定大小,指定数据区间的均匀分布序列
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
- start:起始数字。
- end:结束数字。
- num:生成序列个数;其值默认为50。
- endpoint:取True时,序列包含最大值end;否则不包含;默认为True。
- retstep:该值取True时,生成的序列中显示间距;否则不显示;默认为false。
- dtype:数据类型;当为None时,根据其他输入推断数据类型。
import numpy as np
a1 = np.linspace(1, 10, 5)
print(a1)
# [ 1. , 3.25, 5.5 , 7.75, 10. ]
a2 = np.linspace(1, 10, 5, dtype=np.int_)
print(a2)
# [ 1 3 5 7 10] # 向下取整
a3 = np.linspace(1, 10, 5, endpoint=False)
print(a3)
# [1. 2.8 4.6 6.4 8.2]
四、数组的属性
属性 | 说明 |
ndarray.ndim | 数组的维数(轴 axis 的个数)也称为秩,一维数组的秩为 1,二维数组的秩 为 2,以此类推 |
ndarray.shape | 数组的形状,返回一个元组,这个元组的长度就是数组的维数 |
ndarray.size | 数组元素的总个数,相当于 numpy.shape 中 n*m 的值 |
ndarray.dtype | ndarray 对象的元素类型 |
ndarray.itemsize | ndarray 对象中每个元素的大小,以字节为单位 |
ndarray.flags | ndarray 对象的内存信息 |
ndarray.real | ndarray 元素的实部 |
ndarray.imag | ndarray 元素的虚部 |
numpy.ndarray.ndim 用于返回数组的维数(轴的个数)也称为秩,一维数组的秩为 1,二维数
组的秩为 2,以此类推。
import numpy as np
arr = np.random.randint(1, 10, size=(3, 4))
print(arr)
# [[9 9 7 9]
# [4 6 8 1]
# [6 2 5 5]]
print(arr.ndim, arr.shape, arr.size, arr.dtype, arr.itemsize)
# 2 (3, 4) 12 int32 4
print(arr.flags)
# C_CONTIGUOUS: True
# F_CONTIGUOUS: False
# OWNDATA: True
# WRITEABLE: True
# ALIGNED: True
# WRITEBACKIFCOPY: False
print(arr.real)
# [[9 9 7 9]
# [4 6 8 1]
# [6 2 5 5]]
print(arr.imag)
# [[0 0 0 0]
# [0 0 0 0]
# [0 0 0 0]]
五、NumPy数组索引与切片
ndarray的索引类似于C语言的多维数组的访问,通过下标和维度进行索引访问元素。
ndarray还支持条件判断索引,将符合条件的元素组成一维数组返回。
import numpy as np
arr = np.arange(12)
# [ 0 1 2 3 4 5 6 7 8 9 10 11]
print(arr[1]) # 1,下标索引
print(arr[[0, 2, 4]]) # [0 2 4],整数数列索引
print(arr[arr > 5]) # [ 6 7 8 9 10 11],布尔索引
arr = np.array([[1, 3, 5],
[2, 4, 6]])
print(arr[1], arr[0]) # [2 4 6] [1 3 5]
print(arr[1][2], arr[0][1]) # 6 3
print(arr[arr > 2]) # [3 5 4 6]
print(arr[(arr > 2) & (arr < 5)]) # [3 4]
print(arr[(arr > 5) | (arr < 2)]) # [1 6]
# 多个条件判断只能用 & 和 | , 不能用 and or , 条件要加括号
arr = np.array([np.nan, 1, 2, np.nan])
# [nan 1. 2. nan]
# ~(取补运算符)来过滤NAN
print(arr[np.isnan(arr)]) # [nan nan]
print(arr[~np.isnan(arr)]) # [1. 2.]
ndarray与 Python 中 list 的切片操作类似,numpy.ndarray对象的内容可以通过索引或切片来访问和修改。
numpy数组切片需要使用切片语法,arr[i, j, k, ...],i, j, k分别代表数组第0维、第1维、第2维,通过 (start : stop : step) 方式来操作,从原数组中切割出一个新数组, step默认为1。
一维数组切片:
import numpy as np
arr = np.arange(1, 9)
# [ 0 1 2 3 4 5 6 7 8]
print(arr[:5]) # [1 2 3 4 5]
print(arr[1::2]) # [2 4 6 8], 设置步长为2
print(arr[::-1]) # [8 7 6 5 4 3 2 1], 设置步长为-1, 逆序输出
二维数组切片:
多维数组切片,通过对每个以逗号分隔的维度执行单独的切片,对于二维数组,我们的第一片定义了行的切片,第二片定义了列的切片。
import numpy as np
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
print(arr[0])
# [1 2 3]
print(arr[0:2])
# [[1 2 3]
# [4 5 6]]
print(arr[0:1])
# [[1 2 3]]
print(arr[0:3:2])
# [[1 2 3]
# [7 8 9]]
# 设置步长为2
print(arr[:, 1])
# [2 5 8]
print(arr[1:3, 1:3])
# [[5 6]
# [8 9]]
print(arr[::2, ::2])
# [[1 3]
# [7 9]]
print(arr[::, ::-1])
# [[3 2 1]
# [6 5 4]
# [9 8 7]]
print(arr[::-2, ::-2])
# [[9 7]
# [3 1]]
切片还可以包括省略号 ... ,足够多的冒号可以构建完整的索引列表。
比如,如果 x 是 5 维数组,对 x 数组进行切片:文章来源:https://www.toymoban.com/news/detail-549110.html
- x[1, 2, ...] 等于 x[1, 2, :, :, :]
- x[..., 3] 等于 x[:, :, :, :, 3]
- x[2, ..., 3, :] 等于 x[2, :, :, 5, :]
三维数组切片:文章来源地址https://www.toymoban.com/news/detail-549110.html
import numpy as np
arr = np.random.randint(5, 10, size=(2, 3, 4))
print(arr)
# [[[7 5 5 9]
# [8 7 9 7]
# [6 9 7 8]]
#
# [[8 5 7 7]
# [9 6 8 6]
# [7 8 6 5]]]
print(arr[1, ...])
# [[8 5 7 7]
# [9 6 8 6]
# [7 8 6 5]]
print(arr[..., 2])
# [[5 9 7]
# [7 8 6]]
print(arr[0, ..., 1])
# [5 7 9]
print(arr[0][1])
# [8 7 9 7]
print(arr[1][1][1])
# 6
到了这里,关于【Python爬虫与数据分析】NumPy初阶——数组创建与访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!