Numpy 常用功能简介

一、创建ndarray

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
29
30
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])

# np.ones(x):创建一个长度为x,且元素全为1的ndarray
c = np.ones(2,dtype = np.int)
[1, 1]

# np.ones(x,y):创建一个长度为x行y列,且元素全为1的ndarray
d = np.ones((3,2))
[[1., 1.],
[1., 1.],
[1., 1.]]

# np.zeros(x,y):创建一个x行y列且元素全为0的ndarray
e = np.zeros((3,2))
[[0., 0.],
[0., 0.],
[0., 0.]]

# np.empty(x,y):创建一个x行y列且未初始化的ndarray(随机数填充数据)
f = np.empty((1,2), dtype = int)
[[4607182418800017408, 4607182418800017408]]

# 使用 np.arange 生成连续元素的ndarray
g = np.arange(6) #从0到6,默认间隔(步长)为1
[0, 1, 2, 3, 4, 5]

h = np.arange(0,6,2) #从0到6,间隔为2,不包括6
[0, 2, 4]
1
2
3
4
5
6
7
# 使用 np.linspace(start, stop, num, endpoint, retstep, dtype) 生成ndarray,num:生成ndarray的元素个数
a = np.linspace(1.0, 2.0, num = 10)
[1.,1.11111111,1.22222222,1.33333333,1.44444444,1.55555556,1.66666667,1.77777778,1.88888889,2.]

# np.logspace(start, stop, num, endpoint, base, dtype) : 返回一个 ndarray 对象,其实就是linespace生成的元素值对应的base作为底数的幂
y = np.logspace(1.0, 2.0, num = 10)
[ 10.,12.91549665,16.68100537,21.5443469,27.82559402,35.93813664,46.41588834,59.94842503,77.42636827,100.]

我们来看一下上面生成的两个ndarray所画出的函数是不是10的幂函数图像:

0506_numpy_logspace

对应代码:

1
2
3
4
5
6
7
8
9
plt.subplot(2, 1, 1)
plt.xlabel('linspace')
plt.ylabel('logspace')
plt.plot(a,b,'b-',label='logspace')
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(a,np.power(10,a),'r-',label='10^a')
plt.legend()
plt.show()

1
2
3
4
5
6
7
8
9
10
# np.fromiter(iterable, dtype, count = -1) : 从任何可迭代对象构建一个ndarray对象
list = range(5)
it = iter(list)
# 使用迭代器创建 ndarray
x = np.fromiter(it, dtype = int)
[0 1 2 3 4]

# np.frombuffer():此函数将缓冲区解释为一维ndarray。
但是参数是String类型的会报错误,原因如下:
https://stackoverflow.com/questions/43362986/numpy-frombuffer-attributeerror-str-object-has-no-attribute-buffer

二、ndarray的属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# array.size ndarray元素个数
a.size
4

# array.dtype ndarray元素的类型
a.dtype
dtype('int64')

# array.itemsize ndarray每个元素所占字节大小
a.itemsize
8 # int64类型大小为8字节

# array.ndim ndarray纬度
a.nidm
1
b.ndim
2

# array.shape :ndarray各个维度的长度
a.shape
(4,)
b.shape
(3,4)

三、ndarray操作

单个ndarray操作
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
29
30
31
32
33
# array.sum():求ndarray所有元素的和值。也可以加上axis参数,求各行或者各列的元素和值
# array.min():求ndarray所有元素中的最小值。也可以加上axis参数,求各行或者各列的元素最小值
# array.max():求ndarray所有元素中的最大值。也可以加上axis参数,求各行或者各列的元素最大值

# array.shape = x,y : 通过改变ndarray的shape值,可以改变ndarray的行数和列数.(总数必须一致)
b.shape = 4,3
[[ 1, 2, 3],
[ 4, 4, 5],
[ 6, 7, 7],
[ 8, 9, 10]]

# array.reshape(x,y) 的作用和指定shape值的效果一样,但是会返回一个新的ndarray,并且这个ndarray和原ndarray共享内存,无论修改哪一个ndarray都会引起另外一个ndarray的变化
b.reshape(3,4)

# array.resize(x,y) 用于原地设置形状,也就是修改的是原ndarray。而reshape和shape都是修改之后返回一个新ndarray
b.resize(2,6)
[[ 1, -1, 4, 6, 7, 9],
[ 2, 4, 5, 7, 8, 10]]

# array.ravel() 将ndarray展开,创建视图,视图和原ndarray共享内存,无论修改哪一个ndarray都会引起另外一个ndarray的变化
i = b.ravel()
[ 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10]

# array.flatten() 将ndarray展开,创建副本,副本修改不影响原ndarray变化
j = b.flatten()
[ 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10]

# array.transpose() 用于转置矩阵
k = b.transpose()
[[ 1, 4, 7],
[ 2, 5, 8],
[-1, 6, 9],
[ 4, 7, 10]]
多个ndarray操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# np.vstack(a1,a2) : 纵向(vertical)合并两个ndarray
a1 = np.array([1,2,3])
a2 = np.array([4,5,6])
np.vstack((a1,a2))
[[1, 2, 3],
[4, 5, 6]]

# np.hstack(a1,a2) : 横向(horizontal)合并两个ndarray
a1 = np.array([1,2,3])
a2 = np.array([4,5,6])
np.hstack((a1,a2))
[1, 2, 3, 4, 5, 6]

# np.stach((a1,a2),axis = 1) : axis可以设置堆叠的维度,默认是0,效果和vstack相同,如果设置为1,则是vstack的转置矩阵。
a1 = np.array([1,2,3])
a2 = np.array([4,5,6])
np.stack((a1,a2),axis = 1)
[[1, 4],
[2, 5],
[3, 6]]
ndarray分割
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# np.vsplit(a,num) : 纵向分割
a= np.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
np.vsplit(a,3)
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]

# np.hsplit(a,num) : 横向分割
a= np.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
np.hsplit(a,3)
[array([[0],[3],[6]]), array([[1],[4],[7]]), array([[2],[5],[8]])]

# 也可使用np.split(a, 3, axis=1) 指定axis作为分割方向

四、矩阵运算

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
29
30
31
32
33
34
35
36
37
# ndarray相乘
# * 操作符:每个位置的元素对应相乘.术语广播。等价于np.multiply(a,b)
a = np.array([[2,3],[3,4]])
b = np.array([[3,4],[5,6]])
a * b
[[ 6, 12],
[15, 24]]

a = np.array([[2,3],[3,4]])
b = np.array([[3,4],[5,6]])
a+b
[[ 5, 7],
[ 8, 10]]

a = np.array([[2,3],[3,4]])
b = np.array([[3,4],[5,6]])
a-b
[[-1, -1],
[-2, -2]]

a = np.array([[2,3],[3,4]])
b = np.array([[3,4],[5,6]])
a>b
[[False, False],
[False, False]]

# dot操作符:按照矩阵乘法规则相乘
a.dot(b) # 或者np.dot(a,b)
[[21, 26],
[29, 36]]

# 使用 linalg 模块求逆矩阵。
import numpy.linalg as nla
x = np.array([[1,1],[1,2]])
y = nla.inv(x)
[[ 2., -1.],
[-1., 1.]]

linalg 还有其他多种功能。比如:trace:对角线元素之和, det:计算矩阵行列式,等。

五、ndarray数组的基本索引和切片

ndarray的基本索引
1
2
3
4
x = np.array([[1,2],[3,4],[5,6]])
x[0] # [1, 2]
x[0][1] # 2 ,普通python数组的索引
x[0,1] # 2 ,同x[0][1],ndarray数组的索引
ndarray的切片
1
2
3
4
5
6
7
8
9
x = np.array([1,2,3,4,5])
x[1:3] # [2, 3], 左闭右开的区间
x[:3] # [1,2,3], 左边默认为 0,仍然是左闭右开
x[1:] # [2,3,4,5], 右边默认为数组的长度,仍然是左闭右开

x = np.array([[1,2],[3,4],[5,6]])
x[:2] # [[1, 2],[3, 4]],
x[:2,:1] # [[1],[3]]
x[:2,:1] = 0 # 用标量赋值,x=[[0, 2],[0, 4],[5, 6]]

六、其他用法

1
2
3
4
5
6
7
8
# 使用 where 进行 ndarray 的条件应用
cond = np.array([True,False,True,False])
x = np.where(cond,-2,2)
[-2, 2, -2, 2]

cond = np.array([1,2,3,4])
x = np.where(cond>2,-2,2)
[ 2, 2, -2, -2]

THE END.

评论