Numpy之001 Numpy简介

发布时间 2023-12-10 11:19:58作者: Allen_Hao

简介

Numpy(Numerical Python)是⼀个开源的Python科学计算库,⽤于快速处理任意维度数组的工具。

Numpy⽀持常⻅的数组和矩阵操作。对于同样的数值计算任务,使⽤Numpy⽐直接使⽤Python要简洁的多,性能好
Numpy使⽤ndarray对象来处理多维数组,该对象是⼀个快速⽽灵活的⼤数据容器。

 

ndarray

ndarray 是 Numpy 中的核心特性之一,它是一个多维数组对象,提供了高效的存储和处理大型数据集的能力

 

1. ndarray 的创建

可以通过多种方法创建 ndarray,例如:

  • 从 Python 列表或元组创建
  • 使用 Numpy 函数如 np.zerosnp.onesnp.arangenp.linspace 等
import numpy as np

# 从列表创建
arr1 = np.array([1, 2, 3])

# 使用 np.zeros 创建
arr2 = np.zeros((3, 4))  # 创建一个 3x4 的零矩阵

2. ndarray 的属性

主要的属性包括:

  • ndarray.shape: 数组的形状
  • ndarray.size: 数组中元素的总数
  • ndarray.dtype: 数组元素的数据类型
  • ndarray.ndim: 数组的维度数

3. 数据类型

ndarray 支持多种数据类型,如 int, float, bool ,str等。合适的数据类型使用可以提高存储和计算效率.

4. 索引和切片

ndarray 支持复杂的索引和切片操作,可以选择数组的特定部分。

5. 形状操作

可以改变数组的形状而不改变其数据,例如使用 reshape 方法。

6. 数学运算

ndarray 支持各种数学运算,包括加减乘除、统计操作、线性代数运算等。

7. 广播

广播是 Numpy 对不同形状数组进行算术运算的能力。

最佳实践

  • 选择合适的数据类型:根据需要选择适当的数据类型以节省内存和提高性能。
  • 避免使用循环:利用 Numpy 的向量化操作,避免使用显式循环。
  • 内存管理:注意数组的复制和视图的区别,以避免不必要的内存使用。
  • 使用广播:理解和利用广播机制可以简化代码并提高效率。

1. 使用 NumPy 的内建函数

NumPy 提供了一系列内建函数来创建数组,这些函数通常比手动输入数据更高效。

  • 使用 np.zeros, np.ones, np.arange, np.linspace 等来创建特定形状和模式的数组。
  • 示例:
import numpy as np

# 创建一个全是零的 3x3 矩阵
zeros = np.zeros((3, 3))

# 创建一个 1 到 10 的数组
range_array = np.arange(1, 11)

 

2. 选择合适的数据类型

  • 选择合适的数据类型可以减少内存占用和提高性能。
  • 示例:
    # 使用参数dtype指定传教创建数组的类型
    float_array = np.array([1, 2, 3], dtype=np.float32)
    print(float_array)  # 有点说明是浮点型
    int_array = np.array([1, 2, 3])
    print(int_array)  # 有点说明是浮点型,否则就是int

     

 

3. 利用向量化操作

  • 尽可能使用向量化操作而不是循环,这样可以利用 NumPy 的内部优化。
  • 示例:
# 使用向量操作,替代for循环
arr = np.array([1, 2, 3, 4, 5])
# 向量化加法
arr_plus_10 = arr + 10
print(arr_plus_10)

 

4. 理解视图(View)和副本(Copy)

  • 修改数组的视图会影响原数组,而副本则不会。
  • 使用 copy() 方法可以创建一个数组的副本。
  • 示例:
arr = np.array([1, 2, 3, 4, 5])
# 创建副本
arr_copy = arr.copy()

5. 使用广播机制

  • 广播是 NumPy 的一种机制,允许对不同形状的数组进行算术运算。
  • 理解广播规则可以帮助你写出更简洁高效的代码。
  • 示例:

 

arr = np.array([1, 2, 3])
# 广播机制
result = arr * 2  # 数组中的每个元素都乘以 2

6. 内存布局的考虑

  • 理解数组的内存布局(例如,行主序或列主序)对于性能至关重要,特别是在处理大型数组时。
  • 使用 np.reshapenp.transpose 等函数时要注意数组的内存布局。

示例代码

import numpy as np

# 创建数组
arr = np.arange(10, dtype=np.float32)

# 向量化操作
arr_squared = arr ** 2

# 利用广播
arr_scaled = arr * 2.5

# 视图和副本
arr_copy = arr.copy()
arr_copy[0] = 100
print(arr[0])  # 原数组不受影响

# 处理大型数组时考虑内存布局
large_arr = np.random.rand(1000, 1000)
transpose_arr = large_arr.T  # 转置操作

 

 

 

 

 

示例

import numpy as np  # 导入numpy

# 从列表创建
arr_from_list = np.array([1, 2, 3, 4, 5])
print(type(arr_from_list))
print(arr_from_list)

# 从元组创建
arr_from_tuple = np.array((6, 7, 8, 9, 10))
print(type(arr_from_tuple))
print(arr_from_tuple)

 

列表、元组是有逗号隔开的,而数组元素之间没有逗号哦

 

术语

Numpy

Numerical Python  python科学计算

 

ndarray

N-dimensional array  N维数组