【Python数据科学快速入门系列 | 01】Numpy初窥——基础概念

这是机器未来的第36篇文章

原文首发地址:https://blog.csdn.net/RobotFutures/article/details/125969065

【Python数据科学快速入门系列 | 01】Numpy初窥——基础概念_第1张图片

文章目录

  • 1. 主题
  • 2. Numpy是什么?
  • 3. Numpy的基础概念
    • 3.1 标量、向量、矩阵、张量
      • 3.1.1标量
      • 3.1.2 向量
      • 3.1.3 矩阵
      • 3.1.4 张量
  • 4. Numpy的核心:ndarray对象的属性
    • 4.1 维度或轴 ndarray.ndim与形状 ndarray.shape
    • 4.2 容器的数据类型dtype
    • 4.3 容器的大小 ndarray.size

1. 主题

本文简明扼要的描述了Numpy的概念。

2. 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也是数据容器,有这样一句话,叫做:

  • list是python数据容器
  • ndarray是机器学习的数据容器
  • tensor是深度学习的数据容器

3. Numpy的基础概念

3.1 标量、向量、矩阵、张量

ndarray对象在实际应用中,数组可能会是多个维度的,那么零维、一维、二维、三维…,在Python中是怎么称呼的呢,这里了解一下几个概念:标量、向量、矩阵、张量。

3.1.1标量

就是一个轴上的点,可以理解为0维的一个点。

举例:

x = 5

就是一个标量

3.1.2 向量

就是沿着一个轴的有向序列,可以理解为1维的一条有向直线

举例:

x = [1, 2, 5, 8, 10]

就是一个向量,它是有方向的,它是list,它是有方向的。

3.1.3 矩阵

就是两个互相垂直的轴的数据序列,可以理解为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的矩阵

3.1.4 张量

就是三个或以上互相垂直的轴上的数据序列,可以理解为三维以上的空间上的数据集合,也可以理解为高维数组。

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]]])

4. Numpy的核心:ndarray对象的属性

4.1 维度或轴 ndarray.ndim与形状 ndarray.shape

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方法不会改变数据的内容,只会改变数据形状,只要形状的乘积和原来的乘积相等即可。

4.2 容器的数据类型dtype

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等

4.3 容器的大小 ndarray.size

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零基础快速入门系列
    • 数据科学系列
    • 人工智能开发环境搭建系列
    • 机器学习系列
    • 物体检测快速入门系列
    • 自动驾驶物体检测系列

你可能感兴趣的:(python,numpy,开发语言)