文章目录
前言
本文主要记录了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
对象更重要的属性是:
- ndarray.ndim
数组的轴(维度)的数量。 - ndarray.shape
数组的形状。这是一个整数元组,指示数组每个维度的大小。对于n行m列的矩阵,shape
将为(n,m)
。因此,元组的长度shape
就是轴的数量ndim
。 - ndarray.size
数组元素的总数。这等于shape
的元素的乘积。 - ndarray.dtype
描述数组中元素类型的对象。可以使用标准 Python 类型创建或指定数据类型。此外,NumPy 还提供了自己的类型。例如numpy.int32、numpy.int16 和 numpy.float64。 - ndarray.itemsize
数组中每个元素的大小(以字节为单位)。例如,一个元素type为float64
的数组有itemsize
8 (=64/8),而一个 元素type为complex32
的有itemsize4
(=32/8)。它相当于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]])
>>>a.shape
(3, 5)
>>>a.ndim
2
>>>a.dtype.name
'int64'
>>>a.itemsize
8
>>>a.size
15
>>>type(a)
<class 'numpy.ndarray'>
2.创建数组
- 从常规 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]])
- 创建具有初始占位符内容的数组
通常,数组的元素最初是未知的,但其大小是已知的。因此,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
拓展:
总结
以上就是numpy的基本内容。