4、Numpy的使用

本文介绍了Numpy库的基本概念,包括ndarray的构造、Python原生list与ndarray的效率对比,以及关键操作如数组生成、索引切片、形状修改、类型转换和统计运算。此外,还涵盖了逻辑运算、数组间运算和矩阵运算等内容,帮助读者快速上手科学计算与数据分析。

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

1 Numpy介绍

Numpy(Numerical Python)是一个开源的Python科学计算库。
用于快速处理任意维度的数组,支持常见的数组和矩阵操作,使用ndarray对象来处理多维数组。

1.1 构造个数组

import numpy as np
# 创建ndarray
score = np.array(
[[80, 89, 86, 67, 79],
[78, 97, 89, 67, 81],
[90, 94, 78, 67, 74],
[91, 91, 90, 67, 69],
[76, 87, 75, 67, 86],
[70, 79, 84, 67, 84],
[94, 92, 93, 67, 64],
[86, 85, 83, 67, 80]])

1.2 Python原生list和ndarray运算效率对比

产生100000000个随机数,求和
sum1是Python效率
sum2是ndarray效率

import random
import time
import numpy as np
a = []
for i in range(100000000):
    a.append(random.random())

# 通过%time魔法方法, 查看当前行的代码运行一次所花费的时间
%time sum1=sum(a)

b=np.array(a)

%time sum2=np.sum(b)

ndarray在存储数据的时候,数据与数据的地址都是连续的,这样就给使得批量操作数组元素时速度更快。

这是因为ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而python原生list就只能通过寻址方式找到下一个元素,这虽然也导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy的ndarray就可以省掉很多循环语句,代码使用方面比Python原生list简单的多。
Numpy底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,所以,其效率远高于纯Python代码。

ndarray的优势
内存块风格
list – 分离式存储,存储内容多样化
ndarray – 一体式存储,存储类型必须一样
ndarray支持并行化运算(向量化运算)
ndarray底层是用C语言写的,效率更高,释放了GIL

1.3 N维数组-ndarray

1.3.1 ndarray的属性
ndarray.shape	数组维度的元组
ndarray.ndim	数组维数
ndarray.size	数组中的元素数量
ndarray.itemsize	一个数组元素的长度(字节)
ndarray.dtype	数组元素的类型

例如前面的score对象,可以输出score.shape

1.3.2 ndarray的形状
a = np.array([[1,2,3],[4,5,6]])
b = np.array([1,2,3,4])
c = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
a.shape
b.shape
c.shape

(2, 3) # 二维数组
(4,) # 一维数组
(2, 2, 3) # 三维数组

1.3.3 ndarray的类型
type(score.dtype)

<type ‘numpy.dtype’>

创建数组时制定类型

>>> a = np.array([[1, 2, 3],[4, 5, 6]], dtype=np.float32)
>>> a.dtype
dtype('float32')

2 基本操作

2.1 生成数组的方法

2.1.1 生成0和1的数组
# 全是0
np.zeros([4,8])

# 全是1
np.ones([4,8])
out:
array([[1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1.]])
2.1.2 从现有数组生成

⚠️
np.array(a)是深拷贝
np.asarray(a)是浅拷贝

a = np.array([[1,2,3],[4,5,6]])
# 从现有的数组当中创建
a1 = np.array(a)

# 相当于索引的形式,并没有真正的创建一个新的
a2 = np.asarray(a)
2.1.3 生成固定范围的数组

等间隔数组

np.linspace (start, stop, num, endpoint)

#num:要生成的等间隔样例数量,默认为50
#endpoint:序列中是否包含stop值,默认为ture


np.linspace(0, 100, 11)

等差数组,step为步长

np.arange(start,stop, step, dtype)
np.arange(10, 50, 2)
out:array([10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42,
       44, 46, 48])

等比数组

np.logspace(start,stop, num)
#num:要生成的等比数列数量,默认为50

# 生成10^x
np.logspace(0, 2, 3)
#返回结果:
array([  1.,  10., 100.])
2.1.4 生成随机数组
np.random.rand(2,3)
np.random.rand(d0, d1, ..., dn)
返回[0.01.0)内的一组均匀分布的数。

在这里插入图片描述

2.2 数组的索引、切片

二维数组的索引
举例:获取第一个股票的前3个交易日的涨跌幅数据

# 二维的数组,两个维度 
stock_change[0, 0:3]

三维数组的索引

# 三维
a1 = np.array([ [[1,2,3],[4,5,6]], [[12,3,34],[5,6,7]]])
# 返回结果
array([[[ 1,  2,  3],
        [ 4,  5,  6]],
        
       [[12,  3, 34],
        [ 5,  6,  7]]])
# 索引、切片
>>> a1[0, 0, 1]   # 输出: 2

2.3 形状修改

对象.reshape()
没有进行行列互换,新产生一个ndarray
对象.resize()
没有进行行列互换,修改原来的ndarray
对象.T
进行了行列互换

2.4 类型修改

2.5 jupyter输出太大可能导致崩溃

IOPub data rate exceeded.
    The notebook server will temporarily stop sending output
    to the client in order to avoid crashing it.
    To change this limit, set the config variable
    `--NotebookApp.iopub_data_rate_limit`.

这个问题是在jupyer当中对输出的字节数有限制,需要去修改配置文件

创建配置文件

jupyter notebook --generate-config
vi ~/.jupyter/jupyter_notebook_config.py

取消注释,多增加


## (bytes/sec) Maximum rate at which messages can be sent on iopub before they
#  are limited.
c.NotebookApp.iopub_data_rate_limit = 10000000

但是这里也别加太多~
在这里插入图片描述

2.6 数组的去重

temp = np.array([[1, 2, 3, 4],[3, 4, 5, 6]])
>>> np.unique(temp)
array([1, 2, 3, 4, 5, 6])

3 ndarray运算

3.1 逻辑运算

# 生成10名同学,5门功课的数据
>>> score = np.random.randint(40, 100, (10, 5))

# 取出最后4名同学的成绩,用于逻辑判断
>>> test_score = score[6:, 0:5]

# 逻辑判断, 如果成绩大于60就标记为True 否则为False
>>> test_score > 60
array([[ True,  True,  True, False,  True],
       [ True,  True,  True, False,  True],
       [ True,  True, False, False,  True],
       [False,  True,  True,  True,  True]])

# BOOL赋值, 将满足条件的设置为指定的值-布尔索引
>>> test_score[test_score > 60] = 1
>>> test_score
array([[ 1,  1,  1, 52,  1],
       [ 1,  1,  1, 59,  1],
       [ 1,  1, 44, 44,  1],
       [59,  1,  1,  1,  1]])

3.2 通用判断函数

# 判断前两名同学的成绩[0:2, :]是否全及格
>>> np.all(score[0:2, :] > 60)
False


# 判断前两名同学的成绩[0:2, :]是否有大于90分的
>>> np.any(score[0:2, :] > 90)
True

3.3 np.where(三元运算符)

3.4 统计运算

min(a, axis)
Return the minimum of an array or minimum along an axis.
max(a, axis])
Return the maximum of an array or maximum along an axis.
median(a, axis)
Compute the median along the specified axis.
mean(a, axis, dtype)
Compute the arithmetic mean along the specified axis.
std(a, axis, dtype)
Compute the standard deviation along the specified axis.
var(a, axis, dtype)
Compute the variance along the specified axis.

进行统计的时候,axis 轴的取值并不一定,Numpy中不同的API轴的值都不一样,在这里,axis 0代表列, axis 1代表行去进行统计

# 接下来对于前四名学生,进行一些统计运算
# 指定列 去统计
temp = score[:4, 0:5]
print("前四名学生,各科成绩的最大分:{}".format(np.max(temp, axis=0)))
print("前四名学生,各科成绩的最小分:{}".format(np.min(temp, axis=0)))
print("前四名学生,各科成绩波动情况:{}".format(np.std(temp, axis=0)))
print("前四名学生,各科成绩的平均分:{}".format(np.mean(temp, axis=0)))

4 数组间运算

4.1 数组与数的运算

arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr + 1
arr / 2

# 可以对比python列表的运算,看出区别
a = [1, 2, 3, 4, 5]
a * 3

4.2 数组与数组的运算

无法运算

arr1 = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
arr2 = np.array([[1, 2, 3, 4], [3, 4, 5, 6]])

广播机制
数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样,就可以进行矢量化运算了。下面通过一个例子进行说明:

arr1 = np.array([[0],[1],[2],[3]])
arr1.shape
# (4, 1)

arr2 = np.array([1,2,3])
arr2.shape
# (3,)

arr1+arr2
# 结果是:
array([[1, 2, 3],
       [2, 3, 4],
       [3, 4, 5],
       [4, 5, 6]])

广播机制实现了时两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只需要满足如下任意一个条件即可。

1.数组的某一维度等长。
2.其中一个数组的某一维度为1 。
广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。

5 矩阵(未完)

5.1 矩阵和向量
矩阵就是特殊的二维数组
向量就是一行或者一列的数据
5.2 矩阵加法和标量乘法
矩阵的加法:行列数相等的可以加。
矩阵的乘法:每个元素都要乘。
5.3 矩阵和矩阵(向量)相乘
(M行, N列)*(N行, L列) = (M行, L列)
5.4 矩阵性质
矩阵不满足交换率,满足结合律
5.5 单位矩阵
对角线都是1的矩阵,其他位置都为0
5.6.矩阵运算
np.matmul
np.dot
注意:二者都是矩阵乘法。 np.matmul中禁止矩阵与标量的乘法。 在矢量乘矢量的內积运算中,np.matmul与np.dot没有区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Αиcíеиτеǎг

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值