最近我又决定看数学了,啊,先看下numpy,我好用来画函数图像。
数组
同质数组ndarray
是Numpy中最重要的数据类型,该数据类型由两部分组成:
- 数据
- 描述数据的元数据
生成一维数组
import numpy as np
if __name__ == "__main__":
a0 = np.array(range(11)) # 生成[0 1 2 3 4 5 6 7 8 9 10]
a1 = np.arange(11) # 生成[0 1 2 3 4 5 6 7 8 9 10]
a2 = np.arange(0, 11) # 生成[0 1 2 3 4 5 6 7 8 9 10]
a3 = np.arange(0, 11, 2) # 生成[0 2 4 6 8 10]
生成多维数组
import numpy as np
if __name__ == "__main__":
a = np.array([np.arange(2), np.arange(2)])
print(a)
print('--------------')
print("shape:", a.shape) # shape是由外到内的维度数组成的元组
print("dtype:", a.dtype) # 元数据
选取数组的元素
import numpy as np
if __name__ == "__main__":
a = np.array([np.arange(2), np.arange(2,4), np.arange(4,6)])
print(a)
print('-----------------------')
print('a[0][0]:', a[0][0])
print('a[1][0]:', a[1][0])
print('a[2][0]:', a[2][0])
数组切片
先看一维数组的切片:
import numpy as np
if __name__ == "__main__":
a = np.arange(10)
print(a)
print('-----------')
print(a[0:5]) # [0 1 2 3 4]
print(a[:5]) # [0 1 2 3 4]
print(a[:5:2]) # [0 2 4]
print(a[-3: -1]) # [7 8]
print(a[-3:]) # [7 8 9]
print(a[:]) # [0 1 2 3 4 5 6 7 8 9]
print(a[::-1]) # [9 8 7 6 5 4 3 2 1 0]
和list
上的切片是一样的。再看多维数组的切片:
import numpy as np
if __name__ == "__main__":
a = np.arange(24).reshape(2,3,4) # 这样也可以方便地构建一个多维数组
print(a)
print('-------------')
print('a[0]:')
print(a[0])
print('-----')
print('a[0,0]:')
print(a[0,0])
print('-----')
print('a[0,0,0]:')
print(a[0,0,0])
print('-----')
print('a[:,:,0]:')
print(a[:,:,0])
print('-----')
print('a[...,0]:') # 上面的省略写法
print(a[...,0])
print('-----')
print('a[:,0:2,0]:')
print(a[:,0:2,0])
print('-----')
总得来说,每个维度的切片和一维切片是一样的,不同维度直接用逗号分割。
改变数组的维度
- reshape 返回改变维度后的数组
- resize 改变原数组的维度
- ravel 返回原数组展平后的数组
- flatten 返回原数组展平后的数组
这两个的使用场景区别我暂时没搞懂
组合数组
import numpy as np
if __name__ == "__main__":
a = np.arange(9).reshape(3,3)
b = np.arange(9).reshape(3,3)
c = np.hstack((a, b)) # 横向合并
d = np.vstack((a, b)) # 纵向合并
print(c)
print(d)
分割数组
import numpy as np
if __name__ == "__main__":
a = np.arange(9).reshape(3,3)
print(a)
print('---------')
a1 = np.split(a, 3, 0) # 按第一个维度分割
a2 = np.split(a, 3, 1) # 按第二个维度分割
print(a1)
print(a2)
数据类型
常用的数据类型有
- bool
- int8
- int16
- int32(int)
- int64
- uint8
- uint16
- uint32
- uint64
- float16
- float32
- float64(float)
此外还有复数和随平台改变精度的整形,不常用,用时再查。
创建数组时可以指定数据类型:
import numpy as np
if __name__ == "__main__":
a1 = np.array([1, 2, 3], dtype=np.int)
a2 = np.array([1, 2, 3], dtype=np.int16)
a3 = np.array([1, 2.5, 3.5], dtype=np.float)
a4 = np.array([1, 2.5, 3.5], dtype=np.float16)
print('int:', a1.dtype)
print('int16:', a2.dtype)
print('float:', a3.dtype)
print('float16:', a4.dtype)
数据类型强制转换
每种数据类型都对应一个强制转换函数,函数名通数据类型名:
import numpy as np
if __name__ == "__main__":
print(np.int(1))
print(np.float(1))
print(np.bool(1))