Python之【Numpy总结】

文章目录

  • [NumPy 笔记](#NumPy 笔记)
    • [1. 介绍](#1. 介绍)
    • [2. 安装](#2. 安装)
    • [3. 基本操作](#3. 基本操作)
    • [4. 实际应用示例](#4. 实际应用示例)
    • [5. 高级操作](#5. 高级操作)
    • [6. 总结](#6. 总结)

NumPy 笔记

1. 介绍

NumPy(Numerical Python)是一个用于科学计算的基础库。它提供了高性能的多维数组对象,以及对数组进行操作的函数。NumPy 常被用于数据分析、机器学习、数值计算等领域。

2. 安装

可以使用以下命令安装NumPy:

python 复制代码
pip install numpy

3. 基本操作

3.1 导入NumPy

python 复制代码
import numpy as np

3.2 创建数组

  • 从列表创建数组:
python 复制代码
a = np.array([1, 2, 3, 4, 5])
print(a)
  • 创建多维数组:
python 复制代码
b = np.array([[1, 2, 3], [4, 5, 6]])
print(b)
  • 创建全零数组:
python 复制代码
zeros = np.zeros((2, 3))  #np.zeros(数组元素个数, dtype='类型')
print(zeros)
  • 创建全一数组:
python 复制代码
ones = np.ones((3, 3)) #np.ones(数组元素个数, dtype='类型')
print(ones)
  • 创建指定间隔的数组:
python 复制代码
arr = np.arange(10)  
print(arr)  # 输出: [0 1 2 3 4 5 6 7 8 9]

#指定起始值和终止值
arr = np.arange(1, 10)   #np.arange(起始值(0),终止值,步长(1))
print(arr)  # 输出: [1 2 3 4 5 6 7 8 9]

#指定步长
arr = np.arange(1, 10, 2)
print(arr)  # 输出: [1 3 5 7 9]

#指定数据类型
arr = np.arange(1, 10, 2, dtype=float)
print(arr)  # 输出: [1. 3. 5. 7. 9.]

与 np.linspace 的对比

np.linspace 根据指定的元素数量生成均匀间隔的数组:

python 复制代码
arr = np.linspace(0, 5, 5)
print(arr)  # 输出: [0.  1.25  2.5  3.75  5. ]
  • 创建随机数组:
python 复制代码
random = np.random.random((2, 2))
print(random)

3.3 数组属性

  • 数组形状:
python 复制代码
print(a.shape)  # (5,)
print(b.shape)  # (2, 3)
  • 数组数据类型:np.ndarray.dtype
python 复制代码
print(a.dtype)  # int64
print(b.dtype)  # int64
python 复制代码
import numpy as np
ary = np.array([1, 2, 3, 4, 5, 6])
print(type(ary), ary, ary.dtype)
#转换ary元素的类型
b = ary.astype(float)
print(type(b), b, b.dtype)
#转换ary元素的类型
c = ary.astype(str)
print(type(c), c, c.dtype)
  • 数组元素个数:np.ndarray.size
python 复制代码
print(a.size)  # 5
print(b.size)  # 6
python 复制代码
import numpy as np
ary = np.array([
    [1,2,3,4],
    [5,6,7,8]
])
#观察维度,size,len的区别
print(ary.shape, ary.size, len(ary))
  • 数组维度:np.ndarray.shape
python 复制代码
print(a.ndim)  # 1
print(b.ndim)  # 2
python 复制代码
import numpy as np
ary = np.array([1, 2, 3, 4, 5, 6])
print(type(ary), ary, ary.shape)
#二维数组
ary = np.array([
    [1,2,3,4],
    [5,6,7,8]
])
print(type(ary), ary, ary.shape)

3.4 数组操作

数组切片和索引:
python 复制代码
print(a[0])  # 1
print(b[1, 2])  # 6
print(a[1:4])  # [2 3 4]

ndarray数组索引操作

python 复制代码
# 数组对象切片的参数设置与列表切面参数类似
#  步长+:默认切从首到尾
#  步长-:默认切从尾到首
数组对象[起始位置:终止位置:步长, ...]
# 默认位置步长:1
python 复制代码
import numpy as np
a = np.arange(1, 10)
print(a)  # 1 2 3 4 5 6 7 8 9
print(a[:3])  # 1 2 3
print(a[3:6])   # 4 5 6
print(a[6:])  # 7 8 9
print(a[::-1])  # 9 8 7 6 5 4 3 2 1
print(a[:-4:-1])  # 9 8 7
print(a[-4:-7:-1])  # 6 5 4
print(a[-7::-1])  # 3 2 1
print(a[::])  # 1 2 3 4 5 6 7 8 9
print(a[:])  # 1 2 3 4 5 6 7 8 9
print(a[::3])  # 1 4 7
print(a[1::3])  # 2 5 8
print(a[2::3])  # 3 6 9

多维数组的切片操作

python 复制代码
import numpy as np
a = np.arange(1, 28)
a.resize(3,3,3)
print(a)
#切出1页 
print(a[1, :, :])		
#切出所有页的1行
print(a[:, 1, :])		
#切出0页的1行1列
print(a[0, :, 1])		

ndarray数组的掩码操作

python 复制代码
import numpy as np
a = np.arange(1, 10)
mask = [True, False,True, False,True, False,True, False,True]
print(a[mask])
数组形状变换:
python 复制代码
c = b.reshape(3, 2)
print(c)

视图变维(数据共享): reshape() 与 ravel()

python 复制代码
import numpy as np
a = np.arange(1, 9)
print(a)		# [1 2 3 4 5 6 7 8]
b = a.reshape(2, 4)	#视图变维  : 变为2行4列的二维数组
print(b)
c = b.reshape(2, 2, 2) #视图变维    变为2页2行2列的三维数组
print(c)
d = c.ravel()	#视图变维	变为1维数组
print(d)

**复制变维(数据独立):**flatten()

python 复制代码
e = c.flatten()
print(e)
a += 10
print(a, e, sep='\n')

就地变维:直接改变原数组对象的维度,不返回新数组

python 复制代码
a.shape = (2, 4)
print(a)
a.resize(2, 2, 2)
print(a)
数组拼接:
python 复制代码
d = np.concatenate((a, a))
print(d)
数组分割:
python 复制代码
e = np.split(d, 3)
print(e)
多维数组的组合与拆分:

垂直方向操作:

python 复制代码
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
# 垂直方向完成拆分操作,生成两个数组
d, e = np.vsplit(c, 2)

水平方向操作:

python 复制代码
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 水平方向完成组合操作,生成新数组 
c = np.hstack((a, b))
# 水平方向完成拆分操作,生成两个数组
d, e = np.hsplit(c, 2)

深度方向操作:(3维)

python 复制代码
import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 深度方向(3维)完成组合操作,生成新数组
i = np.dstack((a, b))
# 深度方向(3维)完成拆分操作,生成两个数组
k, l = np.dsplit(i, 2)

长度不等的数组组合:

python 复制代码
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array([1,2,3,4])
# 填充b数组使其长度与a相同
b = np.pad(b, pad_width=(0, 1), mode='constant', constant_values=-1)
print(b)
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
print(c)

多维数组组合与拆分的相关函数:

python 复制代码
# 通过axis作为关键字参数指定组合的方向,取值如下:
# 若待组合的数组都是二维数组:
#	0: 垂直方向组合
#	1: 水平方向组合
# 若待组合的数组都是三维数组:
#	0: 垂直方向组合
#	1: 水平方向组合
#	2: 深度方向组合
np.concatenate((a, b), axis=0)
# 通过给出的数组与要拆分的份数,按照某个方向进行拆分,axis的取值同上
np.split(c, 2, axis=0)

简单的一维数组组合方案

python 复制代码
a = np.arange(1,9)		#[1, 2, 3, 4, 5, 6, 7, 8]
b = np.arange(9,17)		#[9,10,11,12,13,14,15,16]
#把两个数组摞在一起成两行
c = np.row_stack((a, b))
print(c)
#把两个数组组合在一起成两列
d = np.column_stack((a, b))
print(d)

3.5 数学运算

  • 数组元素加减乘除:
python 复制代码
f = np.array([10, 20, 30, 40])
g = np.array([1, 2, 3, 4])
print(f + g)  # [11 22 33 44]
print(f - g)  # [ 9 18 27 36]
print(f * g)  # [ 10  40  90 160]
print(f / g)  # [10. 10. 10. 10.]
  • 数组求和、平均值等:
python 复制代码
print(f.sum())  # 100
print(f.mean())  # 25.0
print(f.min())  # 10
print(f.max())  # 40
  • 矩阵运算:
python 复制代码
h = np.array([[1, 2], [3, 4]])
i = np.array([[5, 6], [7, 8]])
print(np.dot(h, i))  # 矩阵乘法

3.6 广播

NumPy 允许不同形状的数组进行算术运算,这个功能称为广播。

python 复制代码
j = np.array([1, 2, 3])
k = np.array([[0], [1], [2]])
print(j + k)

3.7 ndarray对象属性操作详解

Numpy的内部基本数据类型

类型名 类型表示符
布尔型 bool_
有符号整数型 int8(-128~127) / int16 / int32 / int64
无符号整数型 uint8(0~255) / uint16 / uint32 / uint64
浮点型 float16 / float32 / float64
复数型 complex64 / complex128
字串型 str_,每个字符用32位Unicode编码表示
日期类型 datetime64

自定义复合类型

python 复制代码
# 自定义复合类型
import numpy as np

data=[
	('zs', [90, 80, 85], 15),
	('ls', [92, 81, 83], 16),
	('ww', [95, 85, 95], 15)
]
#第一种设置dtype的方式
a = np.array(data, dtype='U3, 3int32, int32')
print(a)
print(a[0]['f0'], ":", a[1]['f1'])
print("=====================================")
#第二种设置dtype的方式
b = np.array(data, dtype=[('name', 'str_', 2),
                    ('scores', 'int32', 3),
                    ('age', 'int32', 1)])
print(b[0]['name'], ":", b[0]['scores'])
print("=====================================")

#第三种设置dtype的方式
c = np.array(data, dtype={'names': ['name', 'scores', 'ages'],
                    'formats': ['U3', '3int32', 'int32']})
print(c[0]['name'], ":", c[0]['scores'], ":", c.itemsize)
print("=====================================")

#第四种设置dtype的方式  
d = np.array(data, dtype={'name': ('U3', 0),
                    'scores': ('3int32', 16),
                    'age': ('int32', 28)})
print(d[0]['names'], d[0]['scores'], d.itemsize)

print("=====================================")

#测试日期类型数组
f = np.array(['2011', '2012-01-01', '2013-01-01 01:01:01','2011-02-01'])
f = f.astype('M8[D]')
f = f.astype('i4')
print(f[3]-f[0])

f.astype('bool')

类型字符码

类型 字符码
np.bool_ ?
np.int8/16/32/64 i1 / i2 / i4 / i8
np.uint8/16/32/64 u1 / u2 / u4 / u8
np.float/16/32/64 f2 / f4 / f8
np.complex64/128 c8 / c16
np.str_ U
np.datetime64 M8[Y] M8[M] M8[D] M8[h] M8[m] M8[s]

4. 实际应用示例

  • 计算每个学生的平均成绩:
python 复制代码
scores = np.array([[85, 90, 78], [92, 88, 84], [89, 76, 91]])
avg_scores = scores.mean(axis=1)
print(avg_scores)
  • 图像处理中的应用:
python 复制代码
import matplotlib.pyplot as plt
img = np.random.random((100, 100))
plt.imshow(img, cmap='gray')
plt.show()

5. 高级操作

  • 条件筛选:
python 复制代码
l = np.array([1, 2, 3, 4, 5])
print(l[l > 2])  # [3 4 5]
  • 排序:
python 复制代码
m = np.array([3, 1, 2, 5, 4])
print(np.sort(m))  # [1 2 3 4 5]
  • 统计函数:
python 复制代码
print(np.median(m))  # 3.0
print(np.std(m))  # 标准差

6. 总结

NumPy 是一个功能强大且灵活的库,适用于各种科学计算任务。通过掌握其基本和高级操作,可以极大地提高数据处理和分析的效率。

相关推荐
databook5 小时前
Manim实现闪光轨迹特效
后端·python·动效
Juchecar6 小时前
解惑:NumPy 中 ndarray.ndim 到底是什么?
python
用户8356290780517 小时前
Python 删除 Excel 工作表中的空白行列
后端·python
Json_7 小时前
使用python-fastApi框架开发一个学校宿舍管理系统-前后端分离项目
后端·python·fastapi
数据智能老司机13 小时前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机14 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机14 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机14 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i14 小时前
drf初步梳理
python·django
每日AI新事件14 小时前
python的异步函数
python