1. 数组维度、每个维度大小、总大小
import numpy as npa = np.random.randint(10, size=(2, 3))print("a = ", a)print('ndim-数组的维度')print("a ndim= ", a.ndim)print('shape-数组每个维度的大小')print("a shape= ", a.shape)print('size-数组的总大小')print("a size= ", a.size)
2. 创建数组副本
创建数组的副本,而非只是给切片另外赋了个值,即非视图
a = np.arange(10)print(a)b = a[2: 5].copy()print(b)b[0] = 100print(a)[0 1 2 3 4 5 6 7 8 9][2 3 4][0 1 2 3 4 5 6 7 8 9]
3. 三维的理解
print('两层建筑,每层有3行4列共12个房间')a = np.arange(24).reshape(2, 3, 4)print(a)print('三维坐标(楼层,行号,列号)确定一个房间')print(a[1, 2, 1])print('只关心行号和列号,不关心楼层')print(a[: , 2, 1])print('只关心楼层')print(a[0, :, :])两层建筑,每层有3行4列共12个房间[[[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]][[12 13 14 15][16 17 18 19][20 21 22 23]]]三维坐标(楼层,行号,列号)确定一个房间21只关心行号和列号,不关心楼层[ 9 21]只关心楼层[[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11]]
4. 处理数组的形状
print('变形')a = np.arange(24)b = a.reshape(6, 4)print(a)print(b)[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23][[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11][12 13 14 15][16 17 18 19][20 21 22 23]]
5. 拉直数组
c = b.flatten()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]
6. 转置数组
print(b)d = b.transpose()print(d)[[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11][12 13 14 15][16 17 18 19][20 21 22 23]][[ 0 4 8 12 16 20][ 1 5 9 13 17 21][ 2 6 10 14 18 22][ 3 7 11 15 19 23]]
7. 数组水平叠加
e = d * 2print(d)print(e)f = np.hstack((d, e))print(f)[[ 0 4 8 12 16 20][ 1 5 9 13 17 21][ 2 6 10 14 18 22][ 3 7 11 15 19 23]][[ 0 8 16 24 32 40][ 2 10 18 26 34 42][ 4 12 20 28 36 44][ 6 14 22 30 38 46]][[ 0 4 8 12 16 20 0 8 16 24 32 40][ 1 5 9 13 17 21 2 10 18 26 34 42][ 2 6 10 14 18 22 4 12 20 28 36 44][ 3 7 11 15 19 23 6 14 22 30 38 46]]
8. 数组垂直叠加
e = d * 2print(d)print(e)f = np.vstack((d, e))print(f)[[ 0 4 8 12 16 20][ 1 5 9 13 17 21][ 2 6 10 14 18 22][ 3 7 11 15 19 23]][[ 0 8 16 24 32 40][ 2 10 18 26 34 42][ 4 12 20 28 36 44][ 6 14 22 30 38 46]][[ 0 4 8 12 16 20][ 1 5 9 13 17 21][ 2 6 10 14 18 22][ 3 7 11 15 19 23][ 0 8 16 24 32 40][ 2 10 18 26 34 42][ 4 12 20 28 36 44][ 6 14 22 30 38 46]]
9. 横向拆分
print("b = ")print(b)c = np.hsplit(b, 4)print('c=:')print(c)print(c[0])b =[[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11][12 13 14 15][16 17 18 19][20 21 22 23]]c=:[array([[ 0],[ 4],[ 8],[12],[16],[20]]), array([[ 1],[ 5],[ 9],[13],[17],[21]]), array([[ 2],[ 6],[10],[14],[18],[22]]), array([[ 3],[ 7],[11],[15],[19],[23]])][[ 0][ 4][ 8][12][16][20]]
10. 纵向拆分
print('纵向拆分')print("b = ")print(b)c = np.vsplit(b, 6)print('c=:')print(c)print(c[0])b =[[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11][12 13 14 15][16 17 18 19][20 21 22 23]]c=:[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]]), array([[12, 13, 14, 15]]), array([[16, 17, 18, 19]]), array([[20, 21, 22, 23]])][[0 1 2 3]]
11. 数组类型转换
#int32 --> float64 完全ok#float64 --> int32 会将小数部分截断#string_ --> float64 如果字符串数组表示的全是数字,也可以用astype转化为数值类型print('astype改变数组的元素类型')d = b.astype(float)print(d)[[ 0. 1. 2. 3.][ 4. 5. 6. 7.][ 8. 9. 10. 11.][12. 13. 14. 15.][16. 17. 18. 19.][20. 21. 22. 23.]]
12. numpy数组的切片
list和ndarray的切片不同;
list进行切片操作后生成一个新的序列;
ndarray切片是原始数组的视图,而不会单独生成一个新的ndarray,对切片结果的修改会影响到原始数据;
将一个标量赋值给一个切片时,该值会自动传播到整个切片;
列表的元素可以是任何对象,而ndarray只能是相同类型。
1、list切片赋值
a = list(range(10)) # python的range函数生成的是一个对象,需要用list函数将其转换成列表b = a[2: 5]b[1] = 100print(a)print(b)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9][2, 100, 4]
2、ndarray切片赋值
import numpy as npa = np.arange(10)print(a)b = a[2: 5]b[1] = 100print(a)print(b)[0 1 2 3 4 5 6 7 8 9][ 0 1 2 100 4 5 6 7 8 9][ 2 100 4]
a = np.arange(10)print(a)a[2: 5] = 100print(a)[0 1 2 3 4 5 6 7 8 9][ 0 1 100 100 100 5 6 7 8 9]
a = np.arange(10)print(a)b = a[2: 5]b[:] = 100# b = 100# 为什么不能用b = 100?# 当b = 100时,相当与直接把新的值赋值给了新生成的另一个名称为b的这个变量,此时b不再代表a[2: 5]print(a)print(b)[0 1 2 3 4 5 6 7 8 9][ 0 1 100 100 100 5 6 7 8 9][100 100 100]
