前言
总结在和鲸社区学习numpy基础的笔记和收获,代码来自和鲸社区。
一、创建数组
Numpy要求数组为统一类型的数据,不匹配会向上转化,dtype可在创建数组时指明类型。主要包括两种方式,一是利用np.array从列表创建数组,二是使用别的函数创建特殊的数组。使用列表创建数组时,由于列表的形式多样,如使用推导式、range()、嵌套等,故而创建出的数组也是多样的。而使用别的函数创建,有些函数与普通的python一样,如np.arange()、np.random系列,使用方法基本相同可加入额外的参数确定数组的大小。此外还有一些新的,如创建指定值的数组、创建正态分布的数组、单位矩阵等。
import numpy as np
#利用列表创建
a = np.array([1, 2, 3, 4], dtype = 'float')
b = np.array([range(i, i + 3) for i in [2, 4, 6]])
#特殊函数创建
#np.random.
a1 = np.random.random()
print('创建一个[0,1)之间的随机数', a1)
a2 = np.random.random(1)
print('创建一个只包含[0,1)之间一个单一元素的数组', a2)
a3 = np.random.random((3, 3))
print('创建一个[0,1)之间随机数组成的3X3的数组\n', a3)
a4 = np.random.random((2, 3, 4))
print('创建一个[0,1)之间随机数组成的2X3X4的数组\n', a4)
a5 = np.random.uniform(5, 7, (2, 2))
print('创建一个[5,7)之间随机浮点数组成的2X2的数组\n', a5)
a6 = np.random.randint(5, 7, (2, 2))
print('创建一个[5,7)之间随机整数组成的2X2的数组\n', a6)
#指定值
print(np.ones((5,2)))
print(np.zeros(5,2))
print(np.full(3,3),3.14)
#正态分布,均值/标准差/形状
print(np.random.normal(0,1,(4,4))
print(np.random.randn(4,4)) #标准正态分布
#单位矩阵,np.eye(2)
二、数组基础
1.属性
主要包括维度(ndim)、形状(shape)、大小(size)、类型(dtype)、元素字节等。
import numpy as np
x3 = np.random.randint(10, size = (3, 4, 5))
print('x3 ndim: ', x3.ndim) # 数组维度或秩
print('x3.shape:', x3.shape) # 数组形状,每个维度的大小
print('x3.size: ', x3.size) # 数组总大小 各维度大小的乘积
print('x3.dtype: ', x3.dtype) # 数组数据类型
print('x3.itemsize: ', x3.itemsize, 'bytes') # 每个数组元素字节大小
print('x3.nbytes: ', x3.nbytes, 'bytes') # 数组总字节大小 一般nbytes = intemsize * shape
2.索引与切片
基本操作类似列表的索引与切片。不同的是数组切片返回的是原数组的视图而不是副本,因此修改数组切片得到的子数组会同时修改原数组的元素值,可使用copy()修改复制后的子数组。
import numpy as np
x1 = np.random.randint(10,size=(3,4))
#利用索引修改数组的元素值,浮点数插入整型数组时会自动截短
x1[2][2][0] = 10 #第3层第3行第1列的数修改为10
#多维数组切片
print('所有行每隔1列x1[:3, ::2]\n',x1[:3, ::2] )
3.变形、拼接与分裂
变形是把数组的shape进行改变,常用reshape,有时使用np.newaxis把数组转换为二(n)维单列或单行的形式
import numpy as np
x = np.array([1, 2, 3])
# 利用 reshape 或 np.newaxis切片 将一维数组变为二维单行数组
print(x.reshape(1, 3))
print(x[np.newaxis, :])
# 利用 reshape 或 np.newaxis切片 将一维数组变为二维单列数组
print(x.reshape(3, 1))
print(x[:, np.newaxis])
拼接和分裂时注意按行操作还是按列操作。axis=0(默认)是沿着行对每列进行操作,axis=1是沿着列对每行进行操作。拼接常用的是np.concatenate([x,y],axis=0),分裂常用的是np.split(x,[索引列表记录断点位置]),断点归下一组。另外,使用np.vstack(axis=0,垂直方向)、np.hstack可同样实现拼接,vsplit、hsplit实现分裂。
import numpy as np
#拼接
print(np.concatenate([grid, grid], axis = 1))
print('np.vstack垂直栈同axis=0\n', np.vstack([x, y, z, grid]))
print('np.hstack水平栈同axis=1\n', np.hstack([grid, grid]))
# np.dstack沿第三个方向拼接数组
#分裂
grid = np.arange(12).reshape(3,4)
upper, lower = np.vsplit(grid, [2])
print(upper)
print(lower)
三、 通用函数计算
1.常用
常用的运算如加减乘除、取模取余乘方、绝对值、三角函数及指数对数等,具体函数名可查询。此外,还用一些专用的通用函数,如广义阶乘函数,误差函数。
2.特性
三条,一是所有通用函数都可以用out参数指定计算结果的存放位置。提前分配好 y 的空间,并通过 out=y 指定输出位置,就能避免重复的内存分配操作,这对于循环中频繁调用 NumPy 函数时性能优化非常有用。
二是聚合reduce:在普通运算后面加上reduce,即可得到所有元素累积综合。若想得到累计过程,则使用accumulate。
三是outer获得两个不同输入数组所有元素对的函数运算结果(外积)。
import numpy as np
#out存储结果
x = np.arrage(5)
y = np.zeros_like(x) #创建与x相同大小的y,'_like'
print(np.power(2,x,out=y))
#reduce累积
#outer外积
总结
使用常见的函数进行数组的创建,同时借助reshape进行形状的变形,学会数组的拼接与分裂(垂直方向和水平方向的区别),能使用函数进行计算,会用索引和切片取出元素。

被折叠的 条评论
为什么被折叠?



