1. 数组维度、每个维度大小、总大小
import numpy as np
a = 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] = 100
print(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 * 2
print(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 * 2
print(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] = 100
print(a)
print(b)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 100, 4]
2、ndarray切片赋值
import numpy as np
a = np.arange(10)
print(a)
b = a[2: 5]
b[1] = 100
print(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] = 100
print(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]