Numpy使用简介
一、NumPy的简介
NumPy是一个开源的Python科学计算库,即Numerical Python
二、NumPy的功能
- 执行数组与矩阵的操作
- 在科学计算与深度学习等高级领域中被视为必修的工具
- 覆盖丰富的数学函数并涉及多个数学分支
三、NumPy里面最基本的数据类型:ndarray
这个术语被称为N-dimensional array的英文缩写。这是一个由同质元素组成的多维数组。其规模是预先确定好的,这意味著所有元素的数据类型相同。每个这样的对象只具有单一的dtype类型,并且这个数据类型的描述由numpy中的dtype对象来定义。
由形状(shape)参数决定的数组维度及其元素数量。
形状由一个包含n个正整数构成的元组指定;元组中的每个值对应各维度的空间长度;在数学中将这些维度称为轴(axis),而轴的数量则被称为矩阵或张量(tensor)的秩(rank)。
ndarray还有一个显著特点就是其大小无法更改;一旦创建ndarray并指定其大小后,该维度的尺寸将始终保持不变。相比之下,在Python中使用列表时则具有可变性。
定义ndarry:通过调用array( )函数来进行说明,以Python列表作为输入参数来生成一个数组对象,该数组对象中的各个元素即为ndarray中的元素。
四、NumPy的简单使用
导入numpy
import numpy as np
把普通Python中的list转换成ndarray
a = [1,2,3,4,5,6,7,8,9]
print(a) #返回:[1,2,3,4,5,6,7,8,9]
a * 2 #a复制两次,返回:[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]
A= np.array(a) #把普通Python中的list转换成ndarray
print(A) #返回:[1,2,3,4,5,6,7,8,9]
A #返回:array([1,2,3,4,5,6,7,8,9])
print(type(A)) #返回:<class 'numpy.ndarray'>
A*2 #A里面的元素乘以2.返回:array([2,4,6,8,10,12,14,16,18])
直接创建一维数组
b = np.array([1,2,3,4.5])
print(b) #返回:[1 2 3 4 5]
print(type(b)) #返回:<class 'numpy.ndarray'>
创建多维数组
c = np.array([[1,2,3],[4,5,6]])
print(c) #返回:[[1 2 3]
4 5 6]]
print(type(c)) #返回:<class 'numpy.ndarray'>
数组的维数
print(c.ndim) #返回:2
数组的行列数
print(c.shape) #返回:(2,3)
数组的元素个数
print(c.size) #返回:6
指定维数来创建多维数组
e = np.array([1,2,3,4,5,6],ndim = 3)
print(e) #返回:[[[1 2 3 4 5 6]]]
指定维数和数值类型来创建多维数组
f = np.array([1,2,3,4,5,6],ndim = 3, dtype = np.complex)
print(f) #返回:[[[1.+0.j 2.+0.j 3.+0.j 4.+0.j 5.+0.j 6.+0.j ]]]
查看ndarray类型有一些基本属性
| 属性 | 描述 |
|---|---|
| ndarray.ndim | 数组轴的个数,也被称作秩 |
| ndarray.shape | 数组在每个维度上大小的整数元组 |
| ndarray.size | 数组元素的总个数 |
| ndarray.dtype | 数组元素的数据类型,dtype 类型可以用于创建数组中 |
| ndarray.itemsize | 数组中每个元素的字节大小 |
| ndarray.data | 包含实际数组元素的缓冲区地址 |
| ndarray.flat | 数组元素的迭代器 |
通过调整数组shape属性,在不改变元素总数的前提下,实现各维度长度的变化
g = np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]])
print(g) #返回:[[1 2 3 4]
[4 5 6 7]
[7 8 9 10]]
g.shape = 4,3 #作用等同于reshape
print(g) #返回:[[1 2 3
[4 4 5]
[6 7 7]
[8 9 10]]
#注意从(3, 4)改为(4, 3)并不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变。
g.shape = 2,-1
print(g)
#返回:[ [1 2 3 4 4 5]
[6 7 7 8 9 10]]
#当某个轴的元素为-1时,将根据数组元素的个数自动计算此轴的长度
h = g.reshape(6,2)
print(h)
#返回:[1 2]
[3 4]
[4 5]
[6 7]
[7 8]
[9 10]]
#使用数组的reshape方法,可以创建一个改变了尺寸的新数组, 原数组的shape保持不变 。
五、Python基础之数组创建
numpy.empty以随机的方式来创建数组
a = np.empty([3,2],dtype = np.int32)
print(a)
#返回:
[[0 0]
[0 0]
[0 0]]
numpy.zeros返回指定大小的数组,并且以0作为填充
b = np.zeros([2,2],dtype = np.float32)
print(b)
#返回:
[[0. 0.]
[0. 0.]]
numpy.eye函数返回对角线为1,其余为零的数组
d = np.eye(4)
print(d)
#返回:
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
numpy.array函数主要用于将Python中的列表和元组转化为NumPy中的ndarray
x = [1,2,3,4,5,6]
a = np.asarray(x)
print(type(x)) #返回:<class 'list'>
print(type(a)) #返回:<class 'numpy.ndarray'>
numpy.arange函数等同于Python中的range函数,在生成一维数组时基于给定的起始值、终止值和步长进行操作。需要注意的是,生成的一维数组不包含终止值。
x = np.arange(10,20,2,dtype = np.int32)
print(x) #返回:[10 12 14 16 18]
numpy.linspace函数基于start、stop和num参数能够生成等差数列的一维数组;根据endpoint参数可以选择是否包含stop端点,默认情况下会包含该端点。
x = np.linspace(0,20,5)
print(x) #返回:[ 0. 5. 10. 15. 20.]
np.logspace()函数类似于linspace函数,但它生成的是等比数列;以下示例展示了如何生成从1到100且包含20个元素的等比数列
np.logspace(0,2,20)
#array([ 1. , 1.27427499, 1.62377674, 2.06913808,
2.6366509 , 3.35981829, 4.2813324 , 5.45559478,
6.95192796, 8.8586679 , 11.28837892, 14.38449888,
18.32980711, 23.35721469, 29.76351442, 37.92690191,
48.32930239, 61.58482111, 78.47599704, 100. ])
六、存取数据:
数组元素的存取方法遵循Python的标准实现方式,并非独有特性;相较于Python列表序列而言,则通过指定下标范围所获取的新数组实际上是从原始数据中生成的一个视图;这些新生成的子数组仍然共享原始数据的空间
在对数组元素进行存取时,
采用整数序列,
每个取自该整数序列的元素均被用作索引。
该序号表可采用列表形式或数组形式。
所生成的子数组不会与原数组共享内存空间。
x = np.arange(10,1,-1)
x #返回:array([10, 9, 8, 7, 6, 5, 4, 3, 2])
x[[3,3,1,8]] #返回:array([7, 7, 9, 2])
采用布尔掩码
当基于布尔掩码b读取x时(即通过条件筛选),程序会提取出x中对应于b中标记为True的位置上的元素。值得注意的是,在这种情况下生成的新数据块与原始数据空间是独立的;特别提醒的是,在这种情况下生成的新数据块与原始数据空间是独立的。
x = np.arange(5,0,-1)
x #返回:array([5, 4, 3, 2, 1])
x[np.array([True,False,True,False,False])] #返回:array([5, 3])
