初识 NumPy (一)

术语解释#

1. ⽮量算术运算:
    矢量算数运算是指矢量(向量)进行的数学运算,其中矢量由多个数值组成,并且这些数值在相同位置相互位置上相互对应。
    矢量通常表示为具有相同维度的一维数组。矢量算数可以进行逐个元素的运算, 如:加法, 减法, 乘法,和除法
    矢量算数运算的优点:它们可以同时对矢量的所有元素进行操作,从而提高了计算的效率和简洁性,矢量算数运算经常用于处理和操作大量的数据。
    1.1. 矢量加法:将两个矢量的对应元素相加,得到新的矢量结果。
         [1, 2, 3] + [4, 5, 6] = [5, 7, 9]
    1.2. 矢量减法 : 将两个矢量的对应元素相减,得到一个新的矢量作为结果。
        [4, 5, 6] - [1, 2, 3] = [3, 3, 3]
    1.3. 矢量乘法(逐元素乘法):将两个矢量的对应元素相乘,得到一个新的矢量作为结果。
        [1, 2, 3] * [4, 5, 6] = [4, 10, 18]
    1.4. 矢量除法(逐元素除法):将两个矢量的对应元素相除,得到一个新的矢量作为结果。
        [4, 5, 6] / [2, 2, 2] = [2, 2.5, 3]
2.

什么是 NumPy#

NumPy 是 python 的一种开源的数值计数开展,这种工具可用来存储和处理大型矩阵,比 Python 自身的嵌套列表(nested list structure)结构要高效的多,NumPy(Numeric Python)提供了许多高级的数值编程工具,Numpy 的一个重要特性是它的数组计算,是我们做数据分析必不可少的一个包

NumPy 的部分功能如下:#

1.ndarray: 一个具有矢量算数运算和复杂广播能力的快速且节省空间的多维数组。
2.用于对整租数据进行快速运算的标准数学函数(无需编写循环)。
3.用于读写磁盘数据的工具以及用于操作内存映射文件的工具。
4.线性代数,随机数生成以及傅里叶变换功能。
5.用于集成有C,C++,Fortran等语言编写的代码的 A C API。

NumPy 可以高效处理大数组的数据,是因为:#

1.NumPy是在一个连续的内存块中存储数据,独立于其他Python内置对象,NumPy的C语言编写的算法库可以操作内存,而不必进行类型检查或者其他工作,比起Python内置序列,NumPy数组使用内存更小。
2.NumPy可以在整个数组上执行复杂的计算,而不需要Python的for循环

NumPy 数组和 Python 性能比较#

初识 NumPy
基于 NumPy 的算法要比纯 Python 快 10 到 100 倍(甚至更快),并且使用的内存更小

ndarray: 多维数组对象#

该对象是一个快速而灵活的大数据集容器,可以利用这种数组对整块数据进行一些数学运算,其语法和标量元素之间的运算一样

基本使用

初识 NumPy

ndarray 是一个通用的同构数据多维容器,也就是说,其中的所有元素必须是相同类型的,每个数组都有一个 shape(一个表示各维度大小的元祖)和 一个 dtype(一个用于说明数组数据类型的对象):

初识 NumPy

创建 ndarray#

创建数组最简单的办法就是使用 array函数,它接受一切序列型的对象(包括其他数组),然后产生一个新的含有传入数据的 NumPy数组。
列表转换 naarray#

初识 NumPy

嵌套序列(比如由一组等长列表组成的列表)将会被转换为一个多维数组:#

初识 NumPy
如果 是一组不等长列表组成的列表会出现异常

初识 NumPy

  • Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify ‘dtype=object’ when creating the ndarray

这个警告是由于在创建 ndarray 时,当传递具有不同长度或形状的列表或元组时,NumPy 默认会尝试创建一个多维数组,但这种行为已经被弃用。为了继续创建这样的数组,您需要显式地指定 ‘dtype=object’,以将每个元素视为对象类型,由于每个元素被视为对象类型,对于访问和操作元素时的性能会有一些影响
需要在创建数组时指定 dtype = object

import numpy as np

data3 = [[1, 2, 3,4, 5, 6], [7,   8,    9]]
arr3 = np.array(data3, dtype='object')
print(arr3)

Out:  array([list([1, 2, 3, 4, 5, 6]), list([7, 8, 9])], dtype=object)

除了 np.array 之外,还有其他函数可以创建数组,比如 zeros 和 ones 分别可以创建指定长度或者形状的全 0 和 全 1 数组,
创建长度为 10 全是 0 的数组

import numpy as np 

arr1 = np.zeros(10)
print(arr1)

OUT : array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

创建行数为 3 ,列数为 6 的所有元素为 0 的二维数组,默认为浮点数

import numpy as np
arr1 = np.zeros((3, 6))
print(arr1)

OUT: array([[0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0.]])
一些常见数组创建函数,由于 NumPy 关注的是数值计算,因此,如果没有指定数据类型,数据类型默认都是 float64 (浮点数)#
函数 说明
array 将输入数据 (列表,元祖,数组,或者其他序列类型) 转换为 ndarray,要么推断出 dtype 要么特别指定 dtype。默认直接复制输入数据
asarray 将输入转换为 ndarray, 如果输入本身就是一个 ndarray 就不进行复制
arange 类似于内置的 range, 但返回的是一个 ndarray,而不是一个列表
ones, ones_like 根据指定的形状和 dtepe 创建一个全是 1 数组,one_like 以另一个数组为参数,并根据其形状和 dtype 创建一个全 1 数组
zeros, zeros_like 类似于 ones 和 ones_like, 只不过产生的是全 0 数组而已
empty, empty_like 创建新数组,值分配内存空间但不填充任何值
full, full_like 用 fill value 中的所有值,根据指定的形状和 dtype 创建一个数组。full_like 使用另一个数组,用相同的形状和 dtype 创建
eye, identity 创建一个正方的 N X N 的单位矩阵(对角线为 1,其余为 0)

ndarray 的数据类型#

dtype(数据类型)是一个特殊的对象,它含有ndarray将一块内存解释为特定数据类型所需要的信息,在NumPy中 dtype是用于指定数组元素的数据类型的参数。通过指定 dtype,可以控制数组中元素中的的数据类型, 如整数, 浮点数, 布尔值

一些常用的数据类型

  • int : 整数类型
  • float : 浮点数类型
  • bool: 布尔类型
  • complex : 复数类型
  • str : 字符串类型

除了基本的数据类型,还有其他可用的数据类型,如固定大小的整数类型(例如 int8int16int32)、无符号整数类型(uint8uint16uint32)、指定位数的浮点数类型(float16float32float64)等。
在创建数组时,可以通过 dtype 参数指定所需的数据类型。例如,创建一个具有整数类型的数组可以使用以下方式:

import numpy as np

arr = np.zeros((3, 4), dtype=int)
print(arr.dtype)


OUT: int64

在上述示例中,np.zeros((3, 4), dtype=int) 创建一个 3 行 4 列的数组,并将元素的数据类型指定为整数类型(int)。print(arr.dtype) 打印数组的数据类型,这里是 int64,通过指定不同的 dtype,您可以创建具有不同数据类型的数组

如果需要转换 元素的类型,可以通过 astype 方法将数组从一个 dtype 转换成另一个 dtype:

整数转换为浮点数#
import numpy as np

arr = np.array([1, 2, 3, 4])
print(arr.dtype)  # 输出 dtype('int32')
print(arr) # 输出 : array([1, 2, 3, 4, 5])

# 使用astype 转换成浮点数,dtype指定类型
flaot_arr = arr.astype(dtype=np.float64)
print(flaot_arr.dtype) # 输出: dtype('float64')
print(flaot_arr) # 输出 : array([1., 2., 3., 4., 5.])
浮点数转换成整数,会将小数部分截取删除#
import numpy as np
arr = np.array([3.7,-1.2,  -2.8,  0.6, 11,9])
print(arr)  # array([ 3.7, -1.2, -2.8,  0.6, 11. ,  9. ])

# 使用 astype 转成整数
int_arr = arr.astype(np.int32)
print(int_arr)  #  array([ 3, -1, -2,  0, 11,  9])

如果 字符串数组全是数字,也可以用 astype 将其转换为数值形式:

import numpy as np

num_strings = np.array(['12.5', '9.6' , "33"])
# 使用 astype 转成 float
float_arr = num_strings.astype(dtype=np.float64)
print(float_arr) # [12.5  9.6 33. ]

使用 numpy.string_类型是,一定要小心,因为 NumPy 的字符串数据是大小固定的,发生截取时不会发出警告#

学海无涯, 只求悟出此道:star2: 大佬们请多指教#

本作品采用《CC 协议》,转载必须注明作者和本文链接