这是机器未来的第36篇文章
原文首发地址:https://blog.csdn.net/RobotFutures/article/details/125969065
本文简明扼要的描述了Numpy的概念。
NumPy是Python中科学计算的基础包。它是一个Python库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。Numpy底层是用C语言实现的,所以其计算速度极快。
Numpy、pandas、matplotlib被称为Python三剑客。
俗话说流水的上层框架(Tensorflow、Pytorch、PaddlePaddle等),铁打的Numpy,其地位可见一斑。
Numpy被称为数据科学版的list,其核心就是ndarray对象,ndarray(N dim array)是同构多维数组,和list、tuple、dict、set一样,ndarray也是数据容器,有这样一句话,叫做:
ndarray对象在实际应用中,数组可能会是多个维度的,那么零维、一维、二维、三维…,在Python中是怎么称呼的呢,这里了解一下几个概念:标量、向量、矩阵、张量。
就是一个轴上的点,可以理解为0维的一个点。
举例:
x = 5
就是一个标量
就是沿着一个轴的有向序列,可以理解为1维的一条有向直线
举例:
x = [1, 2, 5, 8, 10]
就是一个向量,它是有方向的,它是list,它是有方向的。
就是两个互相垂直的轴的数据序列,可以理解为2维的两条垂直的线构成的平面
举例:
import numpy as np
x = np.random.randint(low=1, high=10, size=(4, 5))
x
array([[9, 5, 8, 3, 9],
[3, 2, 8, 2, 2],
[6, 3, 1, 8, 2],
[6, 9, 4, 4, 7]])
x是一个4*5的矩阵
就是三个或以上互相垂直的轴上的数据序列,可以理解为三维以上的空间上的数据集合,也可以理解为高维数组。
import numpy as np
x = np.random.randint(low=1, high=10, size=(3, 4, 5))
x
array([[[6, 6, 6, 7, 7],
[5, 4, 2, 4, 1],
[2, 4, 9, 3, 1],
[7, 9, 3, 1, 7]],
[[6, 1, 6, 2, 9],
[5, 4, 6, 6, 1],
[2, 7, 3, 9, 6],
[7, 8, 5, 1, 4]],
[[9, 8, 8, 1, 7],
[5, 9, 1, 1, 3],
[6, 6, 2, 6, 2],
[8, 5, 9, 3, 5]]])
import numpy as np
# 创建一个三维的数组,每个维度元素的个数分别为3,4,5
x = np.random.randint(low=1, high=10, size=(3, 4, 5))
print(f"dim:{x.ndim}, x.shape:{x.shape}")
print(x)
dim:3, x.shape:(3, 4, 5)
[[[6 7 5 9 2]
[7 3 5 4 9]
[4 5 2 5 3]
[9 2 9 8 4]]
[[7 2 2 6 1]
[1 8 2 5 6]
[6 4 6 7 3]
[5 2 3 1 4]]
[[5 8 8 4 5]
[1 6 8 7 4]
[6 1 8 5 4]
[4 7 4 9 4]]]
ndim纬度其实是数据轴的概念,几个纬度就是有几个垂直的轴的数量,shape形状描述的是每个轴上分布的数据点的数量。
以数据对象x为例,它的数据纬度为3, 它的形状为(3, 4, 5), 在第一个轴上的数据点是3个, 第二个轴上的数据点是4个,第三个轴上的数据点是5,这是从数据的角度。
有时候我们会将shape中的数字也认为是维度,这里需要注意的是,这个维度被简称了,实际说的是特征维度。
举个例子:
有个人的简化特征描述:姓名、性别、身高、年龄,现在有3个样本,分别是
zhansan,male,180,22
lisi,male,185,26
lucy,female,168,18
这个数据集的形状为(3,4),3个样本,每个样本有4个特征(姓名、性别、身高、年龄),大家常说的shape中的4的维度,就是指的特征维度,从样本来说,的确有4个特征维度来描述这个人。
思考:
现在有一个数据集,它的数据点形状为(N, H, W, C),标签的形状为(N,),模型的输入形状为(N, H, W, C),输出的结果的形状为(N, 1),那么该如何处理呢?
不处理行吗?不行,因为模型在训练的时候需要评估模型质量,会将输出的结果和标签进行偏差计算,如果纬度不一致,会触发ndarray的广播机制,导致不可预知的后果,那么如何修改标签的形状和输出的结果一致呢?
使用ndarray.reshape方法。
import numpy as np
x = np.random.randint(low=1, high=10, size=(30,))
print(x.shape)
x = x.reshape(30, 1)
print(x.shape)
(30,)
(30, 1)
x.reshape??
[0;31mDocstring:[0m
a.reshape(shape, order='C')
Returns an array containing the same data with a new shape.
Refer to `numpy.reshape` for full documentation.
See Also
--------
numpy.reshape : equivalent function
Notes
-----
Unlike the free function `numpy.reshape`, this method on `ndarray` allows
the elements of the shape parameter to be passed in as separate arguments.
For example, ``a.reshape(10, 11)`` is equivalent to
``a.reshape((10, 11))``.
[0;31mType:[0m builtin_function_or_method
reshape方法不会改变数据的内容,只会改变数据形状,只要形状的乘积和原来的乘积相等即可。
ndarray是同构多维数组,它的数据类型都是一样的。
import numpy as np
#x.ndim - 查看容器的维度或轴的数量
x = np.random.randint(low=1, high=10, size=(3, 4, 5))
# 获得ndarray对象的数据维度,可以看到他的维度为3
print(f"dtype:{x.dtype}")
dtype:int64
在机器学习中,操作的数据类型经常是float类型的,怎样将int32修改为float呢?使用ndarray.astype()方法修改
import numpy as np
#x.ndim - 查看容器的维度或轴的数量
x = np.random.randint(low=1, high=10, size=(3, 4, 5))
x = x.astype(float)
print(f"dtype:{x.dtype}")
dtype:float64
ndarray支持的数据类型挺多的,例如int8,int16,int32, int64,uint8,uint16,uint32,float16, float32, float64,complex等
size的大小为shape形状中数字的乘积,表示的是数据容器中数据的个数,并不是占用内存的大小。
import numpy as np
#x.ndim - 查看容器的维度或轴的数量
x = np.random.randint(low=1, high=10, size=(3, 4, 5))
# 获得ndarray对象的数据维度,可以看到他的维度为3
print(f"size:{x.size}")
size:60
最后,简单总结一下概念,Numpy被称为数据科学版的list,可以从ndarray的属性就可以初窥Numpy的强大了。
Numpy为啥这么强大,请继续期待下一节:创建ndarray的方法。
写在末尾:
- 博客简介:专注AIoT领域,追逐未来时代的脉搏,记录路途中的技术成长!
- 专栏简介:从0到1掌握SELinux的使用。
- 面向人群:嵌入式Linux软件工程师
- 专栏计划:接下来会逐步发布跨入人工智能的系列博文,敬请期待
- Python零基础快速入门系列
- 数据科学系列
- 人工智能开发环境搭建系列
- 机器学习系列
- 物体检测快速入门系列
- 自动驾驶物体检测系列
- …