Numpy

NumPy

什么是 NumPy ?

  NumPy 是 Python 中科学计算的基础包。

  • Python 库,提供多维数组对象,各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,有包括数学、逻辑、形状操作、排序、选择、输入输出、离散傅立叶变换、基本线性代数,基本统计运算和随机模拟等等。

  • NumPy 包的核心是 ndarray 对象,它封装了 Python 原生的同数据类型的 n 维数组

  • 为了保证其性能优良,其中有许多操作都是代码在本地进行编译后执行的。

  NumPy 数组和原生 Python Array (数组)之间有几个重要的区别:

方面 NumPy 数组 Python 原生数组
大小 固定大小 动态增长
数据类型 相同 允许不同
效率
代码量
(基于Python的科学和数学软件包)使用 越来越多使用 通常都支持

为什么 NumPy 这么快?

  • 矢量化

  • 广播

介绍

基础知识

  NumPy 的主要对象是同构多维数组:一个元素表(通常是数字),所有类型都相同,由非负整数元组索引。——

举例:3D空间中的

  • [1, 2, 1]:一个轴,该轴有三个元素,长度为3

  • [[ 1., 0., 0.],[ 0., 1., 2.]]:两个轴,第一轴的长度为2,第二轴的长度为3。

  • NumPy 的数组类被调用 ndarray(别名 array),numpy.array

  • Python 的数组类被调用 array,array.array

前者更重要的属性:

  • ndarray.ndim - 数组的轴(维度)的个数。
  • ndarray.shape - 数组的维度。
  • ndarray.size - 数组元素的总数。
  • ndarray.dtype - 数组元素的类型。
  • ndarray.itemsize - 数组中每个元素的字节大小。

等于 ndarray.dtype.itemsize 。

  • ndarray.data - 该缓冲区包含数组的实际元素
import numpy as np
a = np.arange(15).reshape(3, 5)
a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
type(a)

numpy.ndarray

a.ndim

2

a.shape

(3, 5)

a.size

15

a.dtype

dtype('int32')

a.itemsize

4

a.data

<memory at 0x0000022E0246B040>

创建

  使用 array 函数从常规 Python 列表或元组中创建数组,得到的数组的类型是从 Python 列表中元素的类型推导出来的。

a = np.array([2,3,4])
a

array([2, 3, 4])

a.dtype

dtype('int32')

b = np.array([1.2, 3.5, 5.1])
b

array([1.2, 3.5, 5.1])

b.dtype

dtype('float64')

Tip:常见的错误,就是调用 array 的时候传入多个数字参数,而不是提供单个数字的列表类型作为参数。

# a = np.array(1,2,3,4)    # WRONG
a = np.array([1,2,3,4])  # RIGHT
a

array([1, 2, 3, 4])

array 还可以将序列的序列转换成二维数组,将序列的序列的序列转换成三维数组,等等。

b = np.array([(1.5,2,3), (4,5,6)])
b
array([[1.5, 2. , 3. ],
       [4. , 5. , 6. ]])
c = np.array( [ [1,2], [3,4] ], dtype=complex )
c
array([[1.+0.j, 2.+0.j],
       [3.+0.j, 4.+0.j]])

  通常,数组的元素最初是未知的,但它的大小是已知的。因此,NumPy 提供了几个函数来创建具有初始占位符内容的数组。这就减少了数组增长的必要,因为数组增长的操作花费很大。

  • 函数 zeros 创建一个由0组成的数组
  • 函数 ones 创建一个由1组成的数组
  • 函数 empty 创建一个数组,其初始内容是随机的,取决于内存的状态。默认情况下,创建的数组的dtype是 float64 类型的。
np.zeros( (3,4) )
array([[0., 0., 0., 0.],
      [0., 0., 0., 0.],
      [0., 0., 0., 0.]])
np.ones( (2,3,4), dtype=np.int16 )
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]]], dtype=int16)
np.empty( (2,3) )
array([[1.5, 2. , 3. ],
       [4. , 5. , 6. ]])
np.arange( 10, 30, 5 )

array([10, 15, 20, 25])

np.arange( 0, 2, 0.3 )

array([0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])

np.linspace( 0, 2, 9 )

array([0. , 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. ])

from numpy import pi
x = np.linspace( 0, 2*pi, 100 )
f = np.sin(x)

入门

基础

杂项

posted @ 2023-02-27 03:07  手持六脉神剑的外星人  阅读(30)  评论(0编辑  收藏  举报