NumPy模块-线性代数计算库

numpy基础知识

ndarray 对象

ndarray对象的属性

表示一个 n 维数组, 描述相同类型的元素集合, 基于0的索引访问

创建 ndarray

1
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
  • object: 可以返回一个数组或任何(嵌套)序列的对象。
  • dtype: 数据类型对象
  • copy: 对象是否被复制
  • order: C 安行, F 按列, 或者默认(A)
  • subok: 默认情况下,返回的数组被强制为基类数组。 如果为true,则返回子类
  • ndmin: 指定返回数组的最小维数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 最小维度  
import numpy as np
a = np.array([[1,2,3], [1,2,4]], dtype= float ,ndmin = 2)
print(a)
print(a.shape)
print(a.dtype)
print(a.ndim)
print(a.size)
#output:
[[ 1. 2. 3.]
[ 1. 2. 4.]]
(2, 3)
float64
2
6

numpy.array 中的 object 传入参数必须是同一结构的, 否则将进行自动类型转换, 如果指定了 dtype 参数, 则以该参数类型为准(规则与C++类似)

ndarray对象的方法

ndarray.ptp(axis=None, out=None)

ndarray.clip()
ndarray.all()
ndarray.any()
ndarray.swapaxes(axis1, axis2)

numpy支持的数据类型

数据类型对象 dtype

dtype是一个对象, 这个对象所属类的名字叫做 “数据类型”

dtype 通常用于结构化数据类型:

1
2
3
import numpy as np
dt = np.dtype([('age',np.int8)])
print(dt) #输出如下: [('age', 'i1')]

numpy基本操作

根据下标组成新的数组

1
2
3
a = np.asarray([1,2,3,4,5,6,7,8,9])
c = a[[2,3,4]]
print(c) # [3,4,5]

比较运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
a = np.array([[1,2,3], [1,2,4]], dtype= float ,ndmin =  2)
# 可以对ndarray中的值依次进行比较运算符, 返回bool数组
print(a == 3)
#out
[[False False True]
[False False False]]
#out

print(a < 3)
#out
[[ True True False]
[ True True False]]
#out

# 可以根据bool数组对ndarray中的值进行筛选, 返回1维数组
print(a[ a<3 ])
#out
[1. 2. 1. 2.]
#out

向量运算

矩阵运算

矩阵运算主要注意的是axis参数的选择, axis参数的作用是, 沿着axis参数进行运算, 即运算后, 其他维度不变, axis指定的维度消失(所以维度会减1)

numpy常用函数

ndarray对象的创建

np.array

该函数会返回一个ndarray对象(注意numpy中不存在array这种数据对象类型).

np.ndarray

该函数也会返回一个ndarray对象, 但是不推荐使用(为啥?), np.ndarray是一个底层的方法, 会被其他多维数组创建方法所调用

np.zeros()

生成默认元素为 0. (注意是float64类型)的ndarray

1
2
3
4
5
np.zeros ((3,4))

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

np.ones()

生成默认元素为 1. (注意是float64类型)的ndarray

1
2
3
4
5
z = np.ones ((3,4))

array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])

np.arange()

指定范围和数值间的间隔生成 array,注意范围包左不包右

1
2
3
4
l = np.arange(0,10,2)  
# 这里与python中的range不同的是, 必须指定第一个元素, 其次, 这里步长可以为小数, python的则不行

[0 2 4 6 8]

np.random

np.random.random:

1
2
3
4
5
random,  生成0~1的随机小数,默认类型为float64, 还有其他更多类型的random
np.random.random((2,3))

array([[ 0.86166627, 0.37756207, 0.94265883],
[ 0.9768257 , 0.96915312, 0.33495431]])

np.random.randn: 从标准正态分布中随机输出

1
numpy.random.randn(d1,d2,...,dn) # d1,d2,...,dn为维度

np.random.rand: 生成[0,1)之间的随机数据

1
numpy.random.rand(d1,d2,...,dn) # d1,d2,...,dn为维度

ndarray.reshape()

可以对ndarray的维度重新进行调整

1
2
3
4
5
6
arr = np.arange(15).reshape(3, 5)
arr

array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])

数组拼接

np.append()

np.append(arr, values, axis=None)
参数:

  • arr

返回:

np.concatenate()

统计类数值

np.median()

1
numpy.median(a, axis=None, out=None, overwrite_input=False, keepdims=False)

沿着指定的轴计算中位数
参数:

  • a: 类似数组的变量. 不一定非要是ndarray类型, 只要是任何可以转换成ndarray类型的数据变量都可以

np.mean()

1
numpy.mean(a, axis=None, dtype=None, out=None, keepdims=<no value>)

返回沿着指定轴的算数平均值
参数:

  • a: 类似数组的变量.
  • dtype: 数据类型, 可选参数. 对于整数输入来说, 默认返回值为float64, 对于其他floating输入来说, 返回值类型与输入类型保持一致.

np.round()

np.newaxis

np.stack()

函数原型为 stack(arrays, axis=0), 其中, arrays 既可以是列表, 也可以是数组. 其作用是沿着指定的维度(axis)将数组(如果是列表, 就先将列表转化成numpy数组)中的元素 “堆叠” 起来, 代码示例如下:

首先, 对于列表或者元组, 是 np.stack 会首先将这些列表和元组转化成 numpy 数组, 也可以看做是对将列表作为参数传入到 np.asarray() 中, 例如, 下面的两种写法是等价的:

1
2
3
4
5
6
a = [[1,2,3], [4,5,6]]
b = [[1,2,3], [4,5,6]]

# 下面两语句是等价的
c = np.stack((a,b), axis=0)
c = np.stack(np.asarray((a,b)), axis=0)

即使 ab 本身就是 numpy 数组, 也可以使用 np.asarray(), 如下所示:

1
2
3
4
5
a = np.array([1,2,3])
b = np.array([2,3,4])
# 下面两种方式等价
c = np.stack((a,b), axis=0)
c = np.stack(np.asarray((a,b)), axis=0)

下面我们来看看其他更多的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np

# 创建一个二维数组 a
a = np.asarray([[1,2,3],[4,5,6]])
print(a) # [[1 2 3] [4 5 6]]
print(a.shape) # (2, 3), 故 a 具有两个维度, 其中, 第一个维度的size为2, 第二个维度的size为3

# 在a的第一个维度上, 具有两个元素, 分别为 [1 2 3] 和 [4 5 6]
print(a[0]) # [1 2 3]
print(a[1]) # [4 5 6]

# 在a的第二个维度上, 具有三个元素, 分别为:
print(a[0][0]) # 1
print(a[0][1]) # 2
print(a[0][2]) # 3
print(a[1][0]) # 4
print(a[1][1]) # 5
print(a[1][2]) # 6

# 我们按照定义, 沿着第一个维度(axis=0)将元素堆叠起来, 也就是将元素 [1 2 3] 和 [4 5 6] 堆叠起来, 为:
a_0 = np.stack(a, axis=0)
print(a_0) # [[1 2 3] [4 5 6]]
print(a_0.shape) # (2, 3)

# 沿着axis=1 将元素堆叠起来
a_1 = np.stack(a, axis=1)
print(a_1) # [[1 4] [2 5] [3 6]]
print(a_1.shape) # (3, 2)

我们发现, a 的值没有发生变化, 实际上就是这样, 因为我们沿着第一维(0轴), 就是相当于 将数组其他维保持不变, 只将0轴堆叠, 也就是将: a[0], a[1], a[2],... 堆叠起来 , 就形成了一个新的数组 a_0 = [a[0] a[1] a[2] ... ], 仔细观察, 这实际上就是 a. 当 axis=1 时, 我们需要保持其他轴不变, 只将 axis=1 轴上的元素堆叠起来, 也就是要分别将 a[0][0], a[1][0], a[0][1], a[1][1], 以及 a[0][2], a[1][2] 堆叠起来.

下面我们再看一个例子来总结 axis 参数的作用

1
2
3
4
5
6
7
8
9
10
11
12
a=[[1],[2],[3]]
b=[[1],[2],[3]]
c=[[1],[2],[3]]
d=[[1],[2],[3]]

s1 = np.stack((a,b,c,d), axis=0)
s2 = np.stack((a,b,c,d), axis=1)
s3 = np.stack((a,b,c,d), axis=2)

print(s1.shape) # (4, 3, 1)
print(s2.shape) # (3, 4, 1)
print(s3.shape) # (3, 1, 4)

可以看出, 经过 np.stack(array, axis=n) 操作后, 新的数组的 shape 值会使得原来第一维的大小移动到 axis 指定的维度, 而其他维的大小会相应移动, 但是相对位置不变
知道了维度的变化后, 对于 “堆叠” 的理解就会变得容易得多, 具体来说, 令 n=np.asarray((a,b,c,d)):

  • 对于 axis=0, 我们堆叠的是: n[0], n[1], n[2], a[3]; 每个 n[i] 的维度都是 3×1, 故而最终的维度为 4×3×1
  • 对于 axis=1, 我们堆叠的是: n[0][i], n[1][i], a[2][i], a[3][i] for i in range(3); 每个元素的维度均为
  • 对于 axis=2, 我们堆叠的是: n[0][..][i], n[1][..][i], n[2][..][i], n3[..][i] for i in range(1), 式中的 [..] 范围为 0~2, 姑第一维的维度就是 3, 后面的两个维度就是 1×4 (因为i只有0这一种情况)

np.hstack()

np.vstack()

直接用一个较复杂的情况来说明 vstack() 对维度的影响:

1
2
3
4
5
6
7
8
9
10
a=[[[1],[2],[3]],[[1],[2],[3]]] # shape: (2, 3, 1)
b=[[[1],[2],[3]],[[1],[2],[3]]]
c=[[[1],[2],[3]],[[1],[2],[3]]]
d=[[[1],[2],[3]],[[1],[2],[3]]]

vs_a = np.vstack(np.array(a)) # shape of a: (2, 3, 1)
print(vs_a.shape) # (6, 1)

vs = np.vstack((a, b, c, d))
print(vs.shape) # (8, 3, 1)

根据维度的变化, 我们很容易知道 vstack() 的作用实际上就是将前两维的元素合成一维, 可以简单理解成一种平铺展开的方式, 如下所示

1
2
3
4
a= np.array([[[1],[2],[3]],[[1],[2],[3]]])
print(a.shape) # (2, 3, 1)
print(np.vstack(a)) # (6, 1)
# [[1] [2] [3] [1] [2] [3]]

但是注意, 如果传入的数组本身只有两维, 那么就不会将这两维合并, 如下所示:

1
2
3
a = np.array([[1,2,3],[1,2,3]]) # (2, 3)
print(a.shape)
print(np.vstack(a)) # (2, 3) [[1 2 3] [1 2 3]]

https://blog.csdn.net/csdn15698845876/article/details/73380803

np.prod()

乘积

np.newaxis

np.newaxis 在使用上和功能上等价于 None, 使用示例如下:

1
2
x = np.arange(3) # x = array([0 1 2])
x = x[:, np.newaxis] # x = array([[0], [1], [2]])

pad() 填充

https://blog.csdn.net/qq_29592167/article/details/81043640