一个简单的目录
前言
本文详细涵盖了numpy基础的各个方面,包括ndarray常见属性介绍、常见的ndarray的创建方法、ndarray的各种索引、迭代、切片等操作和Numpy的一些常用的内置函数介绍。内容详细,基础,欢迎大家阅读,如若发现问题或有建议,劳烦提醒博主。
正文
ndarray的常见属性
- shape
返回一个元组,表示ndarray各维度的长度。
- ndim
ndarray对象的维度。
- size
ndarray中元素的个数,相当于各维度长度的乘积。
- dtype
ndarray中存储的元素的数据类型。
- itemsize
ndarray中每个元素的字节数。
具体使用如下:
常见的创建array对象的方法
1. np.array(obj, dtype = )
将输入的py对象和ndarray对象转为ndarray对象,并返回一个新的ndarray对象。其中数据类型dtype是可以自己指定的,如果不指定,py会自己默认识别出来的。
- 指定类型:
float
# 一维数组转化为array,并返回一个新的array对象由arr接收
arr = np.array(my_lst, dtype='float')
print(arr)
arr.dtype
int32
arr = np.array(my_lst, dtype='int32')
print(arr)
arr.dtype
int64
arr = np.array(my_lst, dtype='int64')
print(arr)
arr.dtype
- 不指定类型
py自动识别传入的dtype为int32
arr = np.array(my_lst)
print(arr)
arr.dtype
多维转化为ndarray,其实大同小异
# 多维数组转化为array,以二维举例
my_mat = [[1,2,3],[4,5,6],[7,8,9]]
np.array(my_mat)
py对象——元组也可以转化为ndarray
# 元组转化为array
my_tuple = np.array((1,2))
np.array(my_tuple)
只要传入对象在维度和长度上是统一的,也可以混合传入
# 混合py类型传入,
my_lst = [1,2,3]
my_tuple = (1, 2, 3)
# 注意这里外面要加一个中括号,不然会报错
# 注意这里传入对象的维度(shape)都是统一的,如果不统一也会报警告。
np.array([my_tuple, my_lst])
补充:
- np.asarray(): 将输入的py对象转换为ndarray对象,并返回一个新的ndarray对象。但当输入的对象是ndarray时,不会生成新的ndarray对象,新变量指向的依然是原来输入的ndarray对象。
2. 一些常用的内置函数
- np.ones()
# 生成3行4列的全1矩阵
# 若传入参数是一个值而非元组,则生成长度为传入参数的全1的一维数组
np.ones((3,4))
- np.zeros()
# 生成5行5列的零矩阵
# 若传入参数是一个值而非元组,则生成长度为传入参数的全0的一维数组
np.zeros((5,5))
- np.eye()或者np.identity()
# 生成5维的对角矩阵
np.eye(5)
细心看上面所有的输出格式我们不难发现,py默认生成的dtype是float类型的数据。如果查文档可以发现,其默认都是float64类型。
所以如果有填空题让你写np内置函数在不指定dtype下的输出结果,不要忘记是浮点数!
- np.empty(shape, dtype=float, order=‘C’)
生成一个指定维度和数据类型的未初始化的随机数数组:
如果我们想要创建空数组,我们需要指定dtype是一个对象(后续要求用户手动设置数组中的所有值):
我们可以进行手动赋值:
3. np.arange(start, end, step)
值的范围是[start, end)。
浅浅举几个例子:
# 生成0到9的一维数组
# 若不指定步长则默认为1
np.arange(0,10)
# 生成0到10且步长为2的一维数组
np.arange(0,11,2)
4. np.linspace(start, end, num)
细心的小伙伴是可以发现,linspace的end是包含在内的,和arange不同。
值的范围是[start, end]。
# 在0到5之前均匀地取10个点
np.linspace(0,5,10)
5. np.random的一些内置函数
- np.random.rand(shape)
# 返回5个服从0~1均匀分布的随机样本值,随机样本取值范围是 [0,1)
np.random.rand(5)
# 返回5行5列服从0~1均匀分布的随机样本值,随机样本取值范围是 [0,1)
np.random.rand(5,5)
- np.random.randn()
# 返回2个服从具有标准正态分布的随机值
np.random.randn(2)
# 返回4行4列服从具有标准正态分布的随机值
np.random.randn(4,4)
- np.random.randint(start, end, num)
值的范围是[start, end)
# 从1,100之前不包括100返回1个随机整数
np.random.randint(1,100)
# 从1,100之前不包括100,返回10个随机整数
np.random.randint(1,100,10)
ndarray的索引、迭代和切片
索引可以是数值、数值的list、切片或者是布尔类型的list,可以通过索引获得ndarray的一个切片。
Python列表的索引和切片操作在ndarray上仍然适用。
但是要注意ndarray的切片返回的是数组的视图,而非副本,也就是说对切片的修改即是对原始的ndarray的修改。如果你想要获得副本,这需要调用copy()方法。
1. 一维
一维ndarray的索引、切片和迭代类似于py对象的list操作
首先先定义一个arr
- 索引是数值
- 索引是数值的list,返回arr对应下标的值
- 索引是切片
切片格式 list[start : end : step],step为-1则表示反向切片
取值范围[start,end)
- 索引是布尔类型的list
把该布尔数组作为索引则会返回对应值
2. 多维
将一维ndarray利用reshape()转变为三维,其维度对应的长度分别为3,2,2
多维ndarray可以在每一个维度有一个索引,具体可以看实例
- 选取单个索引
- 如果需要降维,则可以适当省略后面的索引
- 如果一些维度需要用切片,一些维度不需要,那么索引也可以这么选取
- 如果此时用bool类型的list则会展平变成一维
3. 迭代
- 一维数组的迭代是和py的list对象相同的
- 多维数组的迭代是针对第一个维度进行迭代的
如果想要对每个元素进行迭代,则可以通过flat属性:
ndarray的shape操作
ndarray的shape是可以通过命令来改变的:
- reshape:将ndarray的shape按照传入的参数进行修改,返回一个新的ndarray对象
如:
arr = np.random.randint(0,101,10).reshape(10,10)
- reval:将多维改为一维,返回一个一维的ndarray
- T:返回原ndarray的转置
- resize:将ndarray的shape按照传入的参数修改
函数名 | 是否修改原ndarray对象 |
---|---|
reshape | 否 |
reval | 否 |
T | 否 |
resize | 是 |
ndarray的一些基础操作及广播机制
对于一些用于标量的算术运算,Numpy可以通过广播的方式将其作用到ndarray的每个元素上,返回一个或者多个新的矢量。
- 如进行操作arr+1,是将arr的每个元素都加1:
- 如果是arr1 + arr2,那是对应位置元素相加:
同理有:
- 一些内置函数也是在元素级别上进行的
可以看到np.multiply()和arr1*arr2效果一样,都是对应元素相乘
如果想要实现矩阵相乘,则可以使用np.dot()
Numpy的一些常用内置函数
- np.max()、np.min()
功能:返回arr中的最大值、最小值
补充:
如果想要获得最大值或最小值的索引,可以使用argmax()或argmin()。
- np.mean()
语法: numpy.mean(arr, axis=None, dtype=float64)
含义:用来计算给定数组沿指定轴的平均数,其中axis表示计算平均数的轴,dtype默认为float64。
- 一维
- 多维,可以指定轴
默认axis=None,即不指定轴,计算范围为全部元素。
若arr为多维,则axis=0表示最外层[],axis=1表示第二层[]…后面的都以此类推。其中最外层[],第二层[]…这些用索引表示的话可以认为是代表arr[][]…[][]中对应的维度。
则对于下面的二维arr,axis=0代表第一层[],即第一层[]对应的维度的索引改变,其他维度在同组内不变。
即
arr[0][0],arr[1][0],arr[2][0]为一组;(147)
arr[0][1],arr[1][1],arr[2][1]为一组;(258)
arr[0][2],arr[1][2],arr[2][2]为一组;(369)
因为axis=0下求得的答案是[4., 5., 6.];
对于axis=1代表第二层[],即第二层[]对应的维度的索引改变,其他维度在同组内不变。
即
arr[0][0],arr[0][1],arr[0][2]为一组;(1,2,3)
arr[1][0],arr[1][1],arr[1][2]为一组;(4,5,6)
arr[2][0],arr[2][1],arr[2][2]为一组;(7,8,9)
123,456,789分别为一组,求得的答案为[2., 5., 8.];
- np.median
语法:numpy.median(arr, axis=None, dtype=float64)
含义:用来计算给定数组沿指定轴的中位数,其中axis表示计算中位数的轴,dtype默认为float64。
同理,我们也可以求得不指定维度下(即所有元素的中位数)、axis=0时的中位数和axis=1下的中位数。
- np.std()
语法:np.std(arr, axis=None)
含义:计算沿指定轴的标准差。
同理,在不指定axis下,求得的是全部元素的标准差。
同样,指定确切的axis我们也可以求得对应axis的标准差。
- np.sum()
语法:np.sum(arr, axis=None)
含义:计算沿指定轴的和。
同理,在不指定axis下,求得的是全部元素的和。
同样,指定确切的axis我们也可以求得对应axis的和。
- np.cumsum()
语法:np.sum(arr, axis=None)
含义:返回给定轴上元素的累积和。
这个和上面的np.sum()有些不同。
当不指定axis时,其返回的是经过展平的一维ndarray,每处的结果相当于是用了一个循环将前面的值进行累加。也就是先将新的ndarray[0]设为arr[0],余下的便令循环变量为i,新的ndarray[i+1]中存放的是arr[i + 1] = arr[0] + … + arr[i - 1],其中i >= 0。
当指定axis时,就不会进行展平了,返回的仍是同维度的答案。
如axis=0,(1,4,7),(2,5,8),(3,6,9)分别成组进行累加,答案为(1,5,12),(2,7,15),(3,9,18)。
axis=1自然也是同理。