Numpy库自学笔记(一、数组的属性与创建)
本笔记内容源于北京某大学课程课件、Numpy官方文档
Numpy简介
NumPy( Numerical Python)是基于Python语言的一种开源的科学数值计算的第三方库,拥有高效的、节约空间的多维数组对象——ndarray以及为基于数据的计算提供大量的标准数学函数,提供线性代数、傅里叶变换、随机数生成等高级数学功能,并且提供C\C++\Fortran等语言的接口支持,便于研究。
#例子:用列表和NumPy中的数组分别计算c=a+b,可以看出利用Numpy计算更加快捷1
a1= [[1,2,3],[2,3,4]]
b1= [[6,4,10],[4,6,15]]
c1= [[0,0,0],[0,0,0]]
for i in range(2):
for j in range(3):
c1[i][j] = a1[i][j]+b1[i][j]
c1
[[7, 6, 13], [6, 9, 19]]
import numpy as np
a= np.array([[1,2,3],[2,3,4]])
b= np.array([[6,4,10],[4,6,15]])
c=a+b
c
array([[ 7, 6, 13],
[ 6, 9, 19]])
Ndarray数组的属性与创建
ndarray中的nd代表n维, ndarray代表n维数组对象,通过下面的方法进行创建。虽然ndarray(n维数组)很多调用的方法与list(列表)类似,但本质上二者不同,不过可以相互转换。
import numpy as np
np.array(object, dtype = None, order = None)
array(<class 'object'>, dtype=object)
- object通常是一个容器或迭代器,将其内容包装成一个ndarray对象
- dtype如果不指定,自动从实际数据中推断
- order:数据在内存中的排列规则,'C’为行方向(默认),'F’为列方向,这会在下文解释
数组的属性
一些检查数组属性的函数
- ndim:返回 int。表示数组的维数
- shape:返回 tuple。表示数组的尺寸,对于 n 行 m 列的矩阵,形状为(n,m)
- size:返回 int。表示数组的元素总数,等于数组形状的乘积
- dtype:返回 data-type。描述数组中元素的类型
- itemsize:返回 int。表示数组的每个元素的大小(以字节为单位)
下面三个图体现出数组具有的三个属性,即数组的维度ndim,数组的形状shape,轴(axis): 标识数据的维度
一维数组为线性,从左到右看
二维数组有axis0、axis1两个轴,先读取行的数据,可见axis0有两个元素[a,b]
,即a对应第一行,b对应第二行a=[5.2,3.0,4.5],b=[9.1,0.1,0.3]
,后读取列的数据,即将二维数组拆分为多行并在一起的一维线性数组,axis1对应列的元素。当我们要查看第一行第二列的元素时,提取第一行的数据axis[0]=[5.2,3.0,4.5]
,后提取第2列的数据为3.0
三维数组则由多个二维数组堆叠而成,先按照axis0的方向,进行切片,产生4个二维数组,在按照二维数组读取数据的方法对数据进行读取。
![]() | ![]() | ![]() |
数据类型
Python语法仅支持整数、浮点数和复数3种类型,而NumPy科学计算涉及数据较多,对存储和性能都有较高要求,对元素类型精细定义,这样有助于NumPy合理使用存储空间并优化性能,也有助于程序员对程序规模有合理评估
![数据类型](https://saveimage-1312914322.cos.ap-nanjing.myqcloud.com/md/202207181627620.png)
x = np.array([1, 2, 3],dtype="int32")
y = np.array([4.0, 5, 6])
print(x.dtype, x.shape, x.ndim)
print(y.dtype, y.shape, y.ndim)
z = x + y
print(z,z.dtype)
int32 (3,) 1
float64 (3,) 1
[5. 7. 9.] float64
当拥有不同数据类型的数组进行运算时,会默认采用运算数组中的最高精度进行运算
举例创建数组
例子
班级 | 姓名 | 数学分析 | 高等代数 | 概率统计 |
---|---|---|---|---|
一班 | 张丽 | 80 | 95 | 84 |
一班 | 王钰 | 90 | 86 | 85 |
二班 | 闵玥 | 92 | 81 | 80 |
二班 | 赵寒 | 83 | 79 | 74 |
#建立一维数组
np.array([80,95,84])
array([80, 95, 84])
np.array((90.,86.,85.))
array([90., 86., 85.])
np.array(['张丽', '王钰', '闵玥', '赵寒'])#U2 长度为2个Unicode字符, Unicode是计算机字符编码
array(['张丽', '王钰', '闵玥', '赵寒'], dtype='<U2')
#二维数组的建立
np. array([[80, 95, 84], [90, 86, 85]])
array([[80, 95, 84],
[90, 86, 85]])
#三维数组的建立
example1=np.array([[[80,95,84],[90,86,85]],[[92,81,80],[83,79,74]]])
#先按照班级进行切片,之后按照同学划分,再按照学科种类分列
#当我们要读取一班张丽的概率统计成绩时,如下文所示
example1[0][0][2]
84
#也可以这样对数据进行读取
example1[0,0,2]
84
#看下example的shape、ndim、size
print(example1.shape)
print(example1.ndim)
print(example1.size)
(2, 2, 3)
3
12
使用常见函数创建数组
NumPy 函 数 | 说 明 |
---|---|
np.ones(shape) | 根据shape生成一个全1的数组, shape是列表或元组类型 |
np.zeros(shape) | 根据shape生成一个全0的数组, shape是列表或元组类型 |
np.eye(n,k=0) | 创建一个n*n单位矩阵, k=0(默认值)表示主对角线,正值表示上对角线,负值表示下对角线 |
np.full(shape,val) | 根据shape生成一个数组,每个元素值都是val |
np.arange(n) | 用于创建一个于等差数列,类似range()函数,返回ndarray类型,元素默认从0到n-1,可以指定start, stop, step,用于整数场合 |
np.linspace(start, stop , n) | 返回n 个在闭区间 [start, stop] 内均匀分布的数值(start, stop , n)(默认含右侧端点)用于浮点数场合 |
np.ones_like(a) | 根据数据a的形状生成一个全1的数组 |
np.zeros_like(a) | 根据数组a的形状生成一个全0的数组 |
np.full_like(a,val) | 根据数组a的形状生成一个数组,每个元素值都是val |
np.logspace(start, stop, num=50, base=10.0) | 用于创建一个于等比数列,num为样本数量,base为l底数 |
#举例
a=np.zeros((2,2,3))#默认是浮点数
print('a=',a)
b=np.ones_like(a)
print('b=',b)
c=np.full([2,2,3],9)
print('c=',c)
a= [[[0. 0. 0.]
[0. 0. 0.]]
[[0. 0. 0.]
[0. 0. 0.]]]
b= [[[1. 1. 1.]
[1. 1. 1.]]
[[1. 1. 1.]
[1. 1. 1.]]]
c= [[[9 9 9]
[9 9 9]]
[[9 9 9]
[9 9 9]]]
np.arange( )
- 创建一个一维数组
- 可以传入一个参数、两个参数或三个参数
- 1个参数: np.arange(n)生成 0 到 n - 1 的连续整数
- 2个参数: np.arange(start,stop) 生成半开区间 [start, stop) 内步长为1的等差数列
- 3个参数: np.arange([start,] stop,[step,]), 生成半开区间 [start,stop) 内的等差数列, step为步长
print(np.arange(10))
print(np.arange(2,10))
print(np.arange(1,10,3))
[0 1 2 3 4 5 6 7 8 9]
[2 3 4 5 6 7 8 9]
[1 4 7]
np.linspace( )
- np.linspace(start, stop, n)
- 返回n 个在闭区间 [start, stop] 内均匀分布的数值
- 可以不包含区间的结束点, 半开区间[start, stop),方法是在 np.linspace() 函数中将参数endpoint 设为 False
一般来说创建非整数间隔的数组,采用np.linspace( ),创建整数间隔的数组采用np.arange( )
print(np.linspace(1, 10, 7))
print(np.linspace(1,10,7,endpoint=False))
[ 1. 2.5 4. 5.5 7. 8.5 10. ]
[1. 2.28571429 3.57142857 4.85714286 6.14285714 7.42857143
8.71428571]
np.logspace(start, stop, num=50, base=10.0)
- 返回num个在闭区间 [basestart, basestop] 内按照等比方式均匀分布的数字
print(np.logspace(1, 5, 5)) #从101到105,含5个数
print(np.logspace(1, 10, 10, base=2)) #从21到210,含10个数
[1.e+01 1.e+02 1.e+03 1.e+04 1.e+05]
[ 2. 4. 8. 16. 32. 64. 128. 256. 512. 1024.]