Python NumPy使用
以下学习参考菜鸟教程https://www.runoob.com/numpy/numpy-advanced-indexing.html
1、一维(多维)数组
# -*- encoding=utf-8 -*- import numpy def f1(): # 一维数组 print(numpy.array([1, 2, 3])) print(numpy.array(['1', '2', '3'])) print(numpy.array(['a', 'b', 'c'])) def f2(): # 二维数组 print(numpy.array([[1, 2, 3], [4, 5, 6]])) print(numpy.array([[1, 2, 3], ['a', 'b', 'c']])) def f3(): # 指定最小维度 print(numpy.array([1, 2, 3], ndmin=2)) def f4(): # 指定数据类型 print(numpy.array([1, 2, 3], dtype=complex))#复数 if __name__ == '__main__': pass f1() f2() f3() f4()
运行
[1 2 3] ['1' '2' '3'] ['a' 'b' 'c'] [[1 2 3] [4 5 6]] [['1' '2' '3'] ['a' 'b' 'c']] [[1 2 3]] [1.+0.j 2.+0.j 3.+0.j]
2、映射C语言中的结构体
# -*- encoding=utf-8 -*- import numpy def f1(): pass print(numpy.dtype(numpy.int8)) # 8位int型,即字节型 print(numpy.dtype(numpy.int16)) # 16位int型 print(numpy.dtype(numpy.int32)) # 32位int型 print(numpy.dtype(numpy.int64)) # 64位int型 print(numpy.dtype(numpy.int_)) # 32或64位int型 print(numpy.dtype('i1')) # 对应int8 print(numpy.dtype('i2')) # 对应int16 print(numpy.dtype('i4')) # 对应int32 print(numpy.dtype('i8')) # 对应int64 def f2(): dt = numpy.dtype([('age', numpy.int8)]) # 定义年龄age,类型是int8 print(dt) data = numpy.array([[(10,), (20,), (30,)]], dtype=dt) # 指定类型为age,int8型 print(data) print(data['age']) # 取出所有的age pass def f3(): # 定义学生结构体,姓名name String 20,年龄age int8,分数grade int16 stu = numpy.dtype([('name', 'S20'), ('age', numpy.int8), ('grade', numpy.int16)]) # 添加三个学生数据 data = numpy.array([('xiao', 20, 80), ('hong', 21, 88), ('lan', 20, 90)], dtype=stu) print(data) print(data['name']) print(data['age']) print(data['grade']) print(type(data['grade'])) pass def f4(): pass if __name__ == '__main__': pass f1() f2() f3() f4()
运行
int8 int16 int32 int64 int32 int8 int16 int32 int64 [('age', 'i1')] [[(10,) (20,) (30,)]] [[10 20 30]] [(b'xiao', 20, 80) (b'hong', 21, 88) (b'lan', 20, 90)] [b'xiao' b'hong' b'lan'] [20 21 20] [80 88 90] <class 'numpy.ndarray'>
3、更改数组的行列数(例如2行3列变为3行二列,1行12列变为2行6列)
# -*- encoding=utf-8 -*- import numpy def f1(): pass a = numpy.array([[2, 3, 1], [4.5, 5, 1], [2, 3, 1]]) print(a) print(a.ndim) # 表示维度,例如二维数组 print(a.shape) # 返回数组的行和列,例如3行3列 def f2(): pass a = numpy.array([[2, 3, 1], [4.5, 5, 1]]) print(a) print(a.ndim) # 表示维度, print(a.shape) # 原来是2行三列 a.shape = (3, 2) # 调整为3行两列 print(a) print(a.shape) b = a.reshape(2, 3) # 也可通过reshape调整 print(b) print(b.shape) def f3(): pass '''itemsize 以字节的形式返回数组中每一个元素的大小。 例如,一个元素类型为 float64 的数组 itemsiz 属性值为 8 (float64 占用 64 个 bits,每个字节长度为 8,所以 64/8,占用 8 个字节), 又如,一个元素类型为 complex32 的数组 item 属性为 4(32/8)。''' # 数组的 dtype 为 int8(一个字节) x = numpy.array([1, 2, 3, 4, 5], dtype=numpy.int8) print(x.itemsize) # 数组的 dtype 现在为 float64(八个字节) y = numpy.array([1, 2, 3, 4, 5], dtype=numpy.float64) print(y.itemsize) def f4(): pass if __name__ == '__main__': pass f1() f2() f3() f4()
运行
[[2. 3. 1. ] [4.5 5. 1. ] [2. 3. 1. ]] 2 (3, 3) [[2. 3. 1. ] [4.5 5. 1. ]] 2 (2, 3) [[2. 3. ] [1. 4.5] [5. 1. ]] (3, 2) [[2. 3. 1. ] [4.5 5. 1. ]] (2, 3) 1 8
4、创建数组
# -*- encoding=utf-8 -*-
import numpy
def f1():
pass
# 创建未初始化的数组
print(numpy.empty(3)) # 默认浮点型,未初始化,所以用随机数填充
# 使用arange创建
print(numpy.arange(0, 10, 2, dtype=float))
def f2():
pass
# 创建初始化为0的数组
a = numpy.zeros(shape=[2, 2], dtype=int) # 创建2行2列的int型数组,
print(a)
b = numpy.zeros(shape=[2, 3],
dtype=[('name', int), ('age', int), ('grade', int)]) # 创建2行3列的student型数组,
print(b)
# 创建初始化为1的数组
a = numpy.ones(shape=[2, 2], dtype=int) # 创建2行2列的int型数组,
print(a)
b = numpy.ones(shape=[2, 3],
dtype=[('name', int), ('age', int), ('grade', int)]) # 创建2行3列的student型数组,
print(b)
def f3():
pass
# 字符串转ndarray
my_str = b'hello world1'
a = numpy.frombuffer(my_str, dtype='S1')
print(a)
print(type(a))
print(a.shape) # 转为3维数组
a.shape = (3, 4)
print(a)
def f4():
pass
if __name__ == '__main__':
pass
f1()
f2()
f3()
f4()
运行
[0. 0. 0.]
[0. 2. 4. 6. 8.]
[[0 0]
[0 0]]
[[(0, 0, 0) (0, 0, 0) (0, 0, 0)]
[(0, 0, 0) (0, 0, 0) (0, 0, 0)]]
[[1 1]
[1 1]]
[[(1, 1, 1) (1, 1, 1) (1, 1, 1)]
[(1, 1, 1) (1, 1, 1) (1, 1, 1)]]
[b'h' b'e' b'l' b'l' b'o' b' ' b'w' b'o' b'r' b'l' b'd' b'1']
<class 'numpy.ndarray'>
(12,)
[[b'h' b'e' b'l' b'l']
[b'o' b' ' b'w' b'o']
[b'r' b'l' b'd' b'1']]
5、等比,等差数列
# -*- encoding=utf-8 -*- import numpy def f1(): pass # 创建等差数列 # linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None,axis=0) # 参数依次为起始值,终止值,需要的个数,是否包含终止值,是否显示间距,数据类型, a = numpy.linspace(1, 10, 5, ) print(a) b = numpy.linspace(1, 10, 5, endpoint=False, retstep=True) # 不包含终止值且显示步长 print(b) def f2(): pass # 等比数列,默认log底数为10,起始值和终止值为底数的次方 a = numpy.logspace(1, 2, 5, dtype=int) # 定义由10-100的5个等比(10**1至10**2) print(a) # 定义由2-2的十次方的5个等比,设置底数为2(2**1至2**10) a = numpy.logspace(1, 10, 5, dtype=int, base=2) print(a) def f3(): pass def f4(): pass if __name__ == '__main__': pass f1() f2() f3() f4()
运行
[ 1. 3.25 5.5 7.75 10. ] (array([1. , 2.8, 4.6, 6.4, 8.2]), 1.8) [ 10 17 31 56 100] [ 2 9 45 215 1024]
6、切片(同string split一样)
# -*- encoding=utf-8 -*-
import numpy
def f1():
pass
a = numpy.array([0, 1, 2, 3, 4])
print(a[1:3]) # 切片和string spilt一样
print(a[0:5:2]) # 步长为2,从0切到5
def f2():
pass
a = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a)
print(a.shape) # 3行3列
print(a[1, ...]) # 切第二行
print(a[1:]) # 第二行以及以后
print(a[..., 1]) # 切第二列
print(a[..., 1:]) # 切第二列以及以后
def f3():
pass
a = numpy.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a[0, 0]) # 取0,0,
print(a[[0, 0, 2], [1, 2, 2]]) # 取0,1和0,2和2,2
print(a[[[0, 0], [2, 2]], [[0, 2], [0, 2]]]) # 0,0 0,2, 2,0, 2,2取四个角
# 可以看做是前一个list元素+后一个list元素
def f4():
pass
x = numpy.arange(32).reshape((8, 4))
print(x)
print(x[[4, 2, 1, 7]]) # 取1,2,4,7行
print((x[x > 5])) # 取元素大于5的
if __name__ == '__main__':
pass
f1()
f2()
f3()
f4()
运行
[1 2]
[0 2 4]
[[1 2 3]
[4 5 6]
[7 8 9]]
(3, 3)
[4 5 6]
[[4 5 6]
[7 8 9]]
[2 5 8]
[[2 3]
[5 6]
[8 9]]
1
[2 3 9]
[[1 3]
[7 9]]
[[ 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 29 30 31]]
[[16 17 18 19]
[ 8 9 10 11]
[ 4 5 6 7]
[28 29 30 31]]
[ 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]
7、一个散点图
# -*- encoding=utf-8 -*-
import numpy
import matplotlib.pyplot as plt
if __name__ == '__main__':
x = numpy.random.rand(10) # 随机十个横坐标
y = numpy.random.rand(10) # 随机十个纵坐标
plt.title('Title') # 设置标题
plt.xlabel('X') # 设置X轴标签
plt.ylabel('Y') # 设置Y轴标签
plt.xlim(-0.5, 1.5) # X轴范围
plt.ylim(0, 1) # Y轴范围
# s表示散点大小,c表示散点颜色,marker表示形状,alpha透明度,linewidths线宽
# s散点的大小,可以不一致大,列表等长度时对应每个坐标,即每个坐标可以不一样大
# size = [20, 100, 100, 50, 100, 100, 10, 100, 100, 100, ]
size = 20
# c颜色也是一样的,可以不同点不同的颜色
# color = ['yellow', 'pink','yellow', 'pink','yellow', 'pink','yellow', 'pink','yellow', 'pink',]
color = 'pink'
plt.scatter(x, y, s=size, c=color, marker='o', alpha=1, linewidths=10)
plt.legend('t') # 设置图标
plt.show() # 显示所画的图
运行
8、多个散点图
# -*- encoding=utf-8 -*- import numpy import matplotlib.pyplot as plt if __name__ == '__main__': x = numpy.random.rand(10) # 随机十个横坐标 y = numpy.random.rand(10) # 随机十个纵坐标 fig = plt.figure() ax1 = fig.add_subplot(221) # 111表示占满该画布和一个散点图没区别,221表示占左上角222右上角223左下224右下 ax1.set_title('one') # 设置标题 plt.xlabel('X') # 设置X轴标签 plt.ylabel('Y') # 设置Y轴标签 plt.xlim(-0.5, 1.5) # X轴范围 plt.ylim(0, 1) # Y轴范围 size = 20 color = 'pink' ax1.scatter(x, y, s=size, c=color, marker='o', alpha=1, linewidths=10) plt.legend('t') # 设置图标 ax2 = fig.add_subplot(224) # 111表示占满该画布和一个散点图没区别,221表示占左上角222右上角223左下224右下 ax2.set_title('two') # 设置标题 plt.xlabel('X--X') # 设置X轴标签 plt.ylabel('Y--Y') # 设置Y轴标签 plt.xlim(0, 1.5) # X轴范围 plt.ylim(-0.5, 1) # Y轴范围 ax2.scatter(x, y, s=100, c='yellow', marker='v', alpha=1,) plt.legend('TT') # 设置图标 plt.show() # 显示所画的图
运行