numpy教程_1_基础

参考numpy官方教程


前言

本文主要记录了numpy的基本内容


一、numpy是什么?

NumPy 是 Python 中科学计算的基础包。它是一个 Python 库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及各种用于快速数组操作的例程,包括数学、逻辑、形状操作、排序、选择、I/O 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。

二、quickstart

1.基础知识

NumPy 的主要对象是同质(homogenenous)多维数组,即所有元素都具有相同的类型。它是一个元素表(通常是数字),由非负整数元组索引。在 NumPy 中,维度(dimensions)称为轴(axes)。
例如,3D 空间中一点的坐标数组[1, 2, 1] , 有一个轴。该轴有 3 个元素,因此我们说它的长度为 3。在下图的示例中,该数组有 2 个轴。第一个轴的长度为 2,第二个轴的长度为 3。

[[1., 0., 0.],
 [0., 1., 2.]]

NumPy 的数组类称为ndarray. 它也被称为 array。请注意,numpy.array与标准 Python 库类array.array不同,后者仅处理一维数组并提供较少的功能。ndarray对象更重要的属性是:

  1. ndarray.ndim
    数组的轴(维度)的数量。
  2. ndarray.shape
    数组的形状。这是一个整数元组,指示数组每个维度的大小。对于n行m列的矩阵,shape将为(n,m)。因此,元组的长度 shape就是轴的数量ndim
  3. ndarray.size
    数组元素的总数。这等于shape的元素的乘积。
  4. ndarray.dtype
    描述数组中元素类型的对象。可以使用标准 Python 类型创建或指定数据类型。此外,NumPy 还提供了自己的类型。例如numpy.int32、numpy.int16 和 numpy.float64。
  5. ndarray.itemsize
    数组中每个元素的大小(以字节为单位)。例如,一个元素type为float64的数组有itemsize8 (=64/8),而一个 元素type为complex32的有itemsize4(=32/8)。它相当于ndarray.dtype.itemsize.
  6. 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]])
>>>a.shape
(3, 5)
>>>a.ndim
2
>>>a.dtype.name
'int64'
>>>a.itemsize
8
>>>a.size
15
>>>type(a)
<class 'numpy.ndarray'>

2.创建数组

  1. 从常规 Python 列表(list)或元组(tuple)创建数组
    可以使用array函数从常规 Python 列表(list)或元组(tuple)创建数组。创建出的数组的类型是根据序列中元素的类型推断出来的。
>>>import numpy as np
>>>a = np.array([2, 3, 4])
>>>a
array([2, 3, 4])
>>>a.dtype
dtype('int64')
>>>b = np.array([1.2, 3.5, 5.1])
>>>b.dtype
dtype('float64')

一个常见的错误在于调用array函数时使用多个参数进行,而不是提供单个序列(sequence)作为一个参数。

>>>a = np.array(1, 2, 3, 4)    # WRONG
Traceback (most recent call last):
  ...
TypeError: array() takes from 1 to 2 positional arguments but 4 were given
>>>a = np.array([1, 2, 3, 4])  # RIGHT

array将序列的序列(sequences of sequences)转换为二维数组,将序列的序列的序列(sequences of sequences of sequences)转换为三维数组,依此类推。
数组的类型也可以在创建时显式指定:

>>>c = np.array([[1, 2], [3, 4]], dtype=complex)
>>>c
array([[1.+0.j, 2.+0.j],
       [3.+0.j, 4.+0.j]])
  1. 创建具有初始占位符内容的数组
    通常,数组的元素最初是未知的,但其大小是已知的。因此,NumPy提供了多个函数来创建具有初始占位符内容的数组。这些最大限度地减少了增长阵列的必要性,这是一项昂贵的操作。
    zeros函数创建一个全是 0 的数组,ones函数创建一个全是1的数组,empty函数创建一个初始内容随机(取决于内存状态)的数组。默认情况下,创建的数组的数据类型是 float64,但可以通过关键字参数dtype指定。
    为了创建数字序列,NumPy 提供了arange函数,它类似于 Python 内置函数range,但返回一个数组。
>>>np.arange(10, 30, 5)
array([10, 15, 20, 25])
>>>np.arange(0, 2, 0.3)  # it accepts float arguments
array([0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])

arange函数与浮点参数一起使用时,由于浮点精度有限,通常无法预测获得的元素数量。因此,通常最好使用linspace函数接收我们想要的元素数量作为参数的函数:

>>>from numpy import pi
>>>np.linspace(0, 2, 9)                   # 9 numbers from 0 to 2
array([0.  , 0.25, 0.5 , 0.75, 1.  , 1.25, 1.5 , 1.75, 2.  ])

3.打印数组

打印数组时,NumPy 以与嵌套列表(nested lists)类似的方式显示它,但具有以下布局:

  • 最后一个轴从左到右打印
  • 倒数第二个从上到下打印
  • 其余部分也从上到下打印,每个切片与下一个切片之间用空行分隔

所以,一维数组打印为行,二维数组打印为矩阵,三维数组打印为矩阵列表。

>>>a = np.arange(6)                    # 1d array
>>>print(a)
[0 1 2 3 4 5]

>>>b = np.arange(12).reshape(4, 3)     # 2d array
>>>print(b)
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]

>>>c = np.arange(24).reshape(2, 3, 4)  # 3d array
>>>print(c)
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]

如果数组太大而无法打印,NumPy 会自动跳过数组的中心部分,只打印角(corners)。要禁用此行为并强制 NumPy 打印整个数组,可以使用 set_printoptions 更改打印选项。

np.set_printoptions(threshold=sys.maxsize)  # sys module should be imported

4.基本操作

数组上的算术运算符(Arithmetic operators)按元素应用,即逐一作用于每个元素。创建一个新数组并用结果填充。

与许多矩阵语言不同,乘积运算符*在 NumPy 数组中按元素进行运算。矩阵乘积可以使用@运算符(在 python >=3.5 中)或dot函数或方法来执行:

>>>A = np.array([[1, 1],
              [0, 1]])
>>>B = np.array([[2, 0],
              [3, 4]])
>>>A * B     # elementwise product
array([[2, 0],
       [0, 4]])
>>>A @ B     # matrix product
array([[5, 4],
       [3, 4]])
>>>A.dot(B)  # another matrix product
array([[5, 4],
       [3, 4]])

某些操作(例如+=*=)会就地修改现有数组,而不是创建新数组。

当操作不同类型的数组时,结果数组的类型对应于更一般或更精确的数组(一种称为向上转换的行为)。

许多一元运算(例如计算数组中所有元素的总和)都是作为ndarray类的方法实现的。

>>>a = np.random((2, 3))
>>>a
array([[0.82770259, 0.40919914, 0.54959369],
       [0.02755911, 0.75351311, 0.53814331]])
>>>a.sum()
3.1057109529998157
>>>a.min()
0.027559113243068367
>>>a.max()
0.8277025938204418

默认情况下,这些操作适用于数组,就像它是数字列表一样,无论其形状如何。但是,通过指定axis参数,您可以沿数组的指定轴应用操作:

>>>b = np.arange(12).reshape(3, 4)
>>>b
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

>>>b.sum(axis=0)     # sum of each column
array([12, 15, 18, 21])

>>>b.min(axis=1)     # min of each row
array([0, 4, 8])

>>>b.cumsum(axis=1)  # cumulative sum along each row
array([[ 0,  1,  3,  6],
       [ 4,  9, 15, 22],
       [ 8, 17, 27, 38]])

5.通用函数

NumPy 提供熟悉的数学函数,例如 sin、cos 和 exp。在 NumPy 中,这些称为“通用函数”(universal functions/ufunc)。在 NumPy 中,这些函数按元素对数组进行操作,生成一个数组作为输出。

>>>B = np.arange(3)
>>>B
array([0, 1, 2])
>>>np.exp(B)
array([1.        , 2.71828183, 7.3890561 ])
>>>np.sqrt(B)
array([0.        , 1.        , 1.41421356])
>>>C = np.array([2., -1., 4.])
>>>np.add(B, C)
array([2., 0., 6.])

all, any,apply_along_axis_,argmax,argmin,argsort,average, bincount, ceil,clip,conj, corrcoef, cov, cross, cumprod, cumsum, diff,dot, floor, inner,invert, lexsort, max, maximum, mean, median, min, minimum, nonzero, outer, prod,re, round, sort, std,sum, trace, transpose, var, vdot, vectorize,where


6.索引、切片和迭代

一维数组可以被索引、切片和迭代,就像 列表 和其他 Python 序列一样。

多维数组的每个轴可以有一个索引。这些索引以逗号​​分隔的元组形式给出:

>>>def f(x, y):
...    return 10 * x + y
...
>>>b = np.fromfunction(f, (5, 4), dtype=int)
>>>b
array([[ 0,  1,  2,  3],
       [10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33],
       [40, 41, 42, 43]])
>>>b[2, 3]
23
>>>b[0:5, 1]  # each row in the second column of b
array([ 1, 11, 21, 31, 41])
>>>b[:, 1]    # equivalent to the previous example
array([ 1, 11, 21, 31, 41])
>>>b[1:3, :]  # each column in the second and third row of b
array([[10, 11, 12, 13],
       [20, 21, 22, 23]])

当提供的索引少于轴的数量时,缺少的索引被视为完整的切片:

>>>b[-1]   # the last row. Equivalent to b[-1, :]
array([40, 41, 42, 43])

NumPy 还允许您使用将:编写为...
点(dots)... 表示生成完整索引元组所需的尽可能多的冒号。例如,如果x是一个有 5 个轴的数组,那么
x[1, 2, ...]相当于x[1, 2, :, :, :]
x[..., 3]相当于x[:, :, :, :, 3]
x[4, ..., 5, :]相当于x[4, :, :, 5, :]

多维数组的迭代是相对于第一个轴完成的:

>>>for row in b:
...    print(row)
...
[0 1 2 3]
[10 11 12 13]
[20 21 22 23]
[30 31 32 33]
[40 41 42 43]

但是,如果想要对数组中的每个元素执行操作,可以使用flat属性,该属性是数组所有元素的迭代器:

>>>for element in b.flat:
...    print(element)
...
0
1
2
3
10
11
12
13
20
21
22
23
30
31
32
33
40
41
42
43

拓展:

  1. Indexing on ndarrays
  2. Indexing routines
  3. newaxis
  4. ndenumerate
  5. indices

总结

以上就是numpy的基本内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值