这里写目录标题
Numpy数组与矩阵(一)
1 ndarray对象
Numpy最重要的的一个特点是N为数组对象ndarray,它是一系列同类型数据的集合,以0 下标为开始对集合中的元素建立索引。
ndarray的组成部分有:
- 一个指向数据(内存或内存映射文件中的一块数据)的指针;
- 数据类型或dtype,描述在数组中的固定大小的格子;
- 一个表示数组形状(shape)的元组,表示各维度大小的元组;
- 一个跨度元组(stride),其中的整数指的是为了前进到当前维度的下一个元素需要“跨过”的字节数。
创建一个ndarray只需要调用Numpy的array函数就可以了,它的语法结构如下所示:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
以下进行参数说明:
名 称 | 描 述 |
---|---|
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
下面我们给出几个实例:
# 导入Numpy库,并给它起一个别名:np
import numpy as np
# 示例一
a = np.array([1, 2, 3, 4, 5])
# 示例二
data = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
b = np.array(data)
当我们需要查看数组的维度时,直接调用ndim属性就可以了,具体我们可以使用变量名.ndim来查看。
2 数据类型
NumPy支持的数据类型比Python内置的类型要多很多,其中的不分类型也是对应于Python的内置类型而精心设计的。
名 称 | 描 述 |
---|---|
bool_ | 布尔数据类型(True或False) |
int_ | 默认的整数类型(就像C语言中long,int32或int64) |
intc | 和C语言中的int一样,一般是int32 或int64 |
intp | 用于索引的整数类型(一般情况下仍然是int32 或int64) |
int8 | 字节(-128~127) |
int16 | 整数(-32768~32767) |
int32 | 整数(-2147483648~2147483647) |
int64 | 整数(-9223372036854775808~9223372036854775807) |
uint8 | 无符号整数(0~255) |
uint16 | 无符号整数(0~65535) |
uint32 | 无符号整数(0~4294967295) |
uint64 | 无符号整数(0~18446744073709551615) |
float_ | float64类型的简写 |
float16 | 半精度浮点数,包括:1个符号位,5个指数位,10个尾数位 |
float32 | 单精度浮点数,包括:1个符号位,8个指数位,23个尾数位 |
float64 | 双精度浮点数,包括:1个符号位,11个指数位,52个尾数位 |
complex_ | complex128类型的简写,也就是128位复数 |
complex64 | 复数,表示双32位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双64位浮点数(实数部分和虚数部分) |
以下我将会举出几个实例:
import numpy as np
c = np.array([1, 2, 3, 4, 5])
print(c)
c.dtype
运行以上程序,我们知道数组c中各元素的数据类型是int32。
d = np.array([-11.7, 41.55, 32.6, -19.88, 32.11, -9.5])
print(d)
d.dtype
3 数组属性
Numpy的数组中比较重要的ndarray对象属性如下表所示。
属 性 | 说 明 |
---|---|
ndarray.ndim | 秩,也就是轴的数量或者维度的数量 |
ndarray.shape | 数组的维度,对于矩阵,n行m列 |
ndarray.size | 数组元素的总个数,相当于shape中n*m的值 |
ndarray.dtype | ndarray对象的元素类型 |
ndarray.itemsize | ndarray对象中每个元素的大小,以字节为单位 |
ndarray.flags | ndarray对象的内存信息 |
ndarray.real | ndarray元素的实部 |
ndarray.imag | ndarray元素的虚部 |
ndarray.data | 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性 |
我们通过实例来说明数组的这些特性。我们首先需要创建数组,然后直接调用数组的这些属性。
a = np.arange(25, dtype = np.float_).reshape(5, 5)
b = np.array([1, 2, 3, 4, 5])
print(a)
print(b)
我们创建了a,b两个不同维度的数组,之后我们调用属性查看这两个数组之间的差别。
print('数组a的属性:')
print(a.ndim)
print(a.shape)
print(a.size)
print(a.dtype)
print(a.itemsize)
以上就是数组a的所有属性显示。
print('数组b的属性:')
print(b.ndim)
print(b.shape)
print(b.size)
print(b.dtype)
print(b.itemsize)
以上就是数组b的所有属性显示。
4 创建数组
以下给出数组创建函数:
函 数 | 描 述 |
---|---|
array | 将输入的数据(列表、元组、数组或其他序列类型)转换成ndarray |
asarray | 将输入转换为ndarray,如果已经是ndarray,则不用复制 |
arange | 直接返回ndarray而不是列表 |
ones,ones_like | ones表示生成一个由1组成的数组;ones_like表示返回与指定数组具有相同形状和数据类型的数组,并且数组中的值都是1 |
zeros,zeros_like | zeros表示生成一个由1组成的数组;zeros_like表示返回与指定数组具有相同形状和数据类型的数组,并且数组中的值都是0 |
empty,empty_like | 通过分配新内存来创建新数组,但不要使用1和0之类的来填充数组 |
full,full_like | 返回与给定数组具有相同形状和类型的数组,并且数组中元素的值是fill_value的值 |
eye,identity | 创建一个正方形N*N单位矩阵(对角线上的值为1,其余都为0) |
4.1 零元素数组
我们创建全部都是由0来填充的数组,要使用**zeros函数**,下面将会给出具体创建函数以及参数说明。
numpy.zeros(shape, dtype = float, order = 'C')
参数说明如下:
参 数 | 描 述 |
---|---|
shape | 数组形状 |
dtype | 数据类型,可选 |
order | ‘C’用于C的行数组,或者‘F’用于FORTRAN的列数组 |
实例说明:
import numpy as np
a = np.zeros((5,2))
print(a)
4.2 一元素数组
利用==ones函数==来实现全部由1来填充元素的数组,具体语法结构以及参数说明如下述:
numpy.ones(shape, dtype = None, order = 'C')
至于以上提到的参数,和零元素数组中的参数说明相同,在此不再概述。
下面我们将举出实例进行说明:
import numpy as np
b = np.ones((5, 5))
print(b)
print(b.dtype)
4.3 arange函数
在Numpy中,我们还可以通过**arange函数**来创建数组,并且用arange函数创建出来的是ndarray对象。具体的函数使用以及参数说明如下述:
numpy.arange(start, stop, step, dtype)
参数说明如下:
参 数 | 描 述 |
---|---|
start | 是数组的起始值,默认为0 |
stop | 终止值(且不包含,也就是到这个数或者超过这个数,就停止) |
step | 步长,默认情况下为1 |
dtype | 返回ndarray的数据类型,如果没有提供,就会使用输入数据的类型 |
实例演示:
import numpy as np
arr1 = np.arange(0, 10, 2)
arr2 = np.arange(10, -10, -4)
arr3 = np.arange(1, 5, 2, dtype = float)
arr4 = np.arange(10)
print('arr1 = ', arr1)
print('arr2 = ', arr2)
print('arr3 = ', arr3)
print('arr4 = ', arr4)
4.4 等差数列数组
Numpy中的**linspace函数**是用来创建一个一维数组,该数组是由一个等差数列构成的。具体语法结构如下所述:
nmupy.linspace(start, stop, num = , endpoint = True, retstep = Fasle, dytpe = None)
具体参数说明如下:
参 数 | 描 述 |
---|---|
start | 序列的起始值 |
stop | 序列的终止值,如果endpoint是True,该值将会包含在数列中 |
num | 要生成的等步长的样本数量,默认为50 |
endpoint | 该值为True时,数列中包含stop值;反之,则不包括。默认为True |
retstep | 如果是True,生成的数组中会显示间距,反之不会显示 |
dtype | ndarray的数据类型 |
实例说明:
import numpy as np
a = np.linspace(0, 5, 6)
b = np.linspace(0, 5, 6, endpoint = False)
print("a = ", a)
print("b = ", b)
4.5 等比数列数组
Numpy中的**logspace函数**可以用来创建一个等比数列,语法格式如下:
nmupy.logspace(start, stop, num = , endpoint = True, base = , dtype = None)
参数具体说明如下:
参 数 | 描 述 |
---|---|
start | 序列的起始值基于base**start |
stop | 序列的终止值j基于base**stop,如果endpoint是True,该值将会包含在数列中 |
num | 要生成的等步长的样本数量,默认为50 |
endpoint | 该值为True时,数列中包含stop值;反之,则不包括。默认为True |
base | 对数log的底数 |
dtype | ndarray的数据类型 |
具体实例说明:
import numpy as np
a = np.logspace(1, 10, 10 ,base = 2)
print(a)
5 数据索引与切片
ndarray对象可以通过索引过着切片进行访问和修改,Numpy切片语法和Python列表切片的方法相同。下面我我将为大家介绍数组的索引与切片。
5.1 索引
我们将会了解如何通过索引和切片来选择元素,以此来获得其中的值。数组的索引总是使用“[]”来索引数组的元素,以便这些元素可以被单独引用,用于不同的用途,下面我们将通过案例来说明如何进行索引操作。
import numpy as np
a = np.random.randn(6)
print("a = ", a)
print("a[2] = ", a[2])
print("a[-1] = ", a[-1])
依据上面的例子,我们可以看到,在一维数组中,我们可以通过中括号指定索引第i个值(从0开始计数)。我们的例子中a[2],输出的是第三个数。
当然,我们也可以从后向前索引,最后一个元素的索引是-1,像例子中a[-1],输出的就是最后一个数。
print("a[[1,4]] = ", a[[1,4]])
如果我们需要选择多各项,可以在方括号中传递索引数组,就比如我们需要第2个和第5个数字,我们就可以使用a[[1, 4]],来达到获取数组中的两个数据。
当然,我们还可以定义一个二维数组,二维数组被表示成由行和列组成的矩形数组,由两个轴来定义,其中轴0表示行,轴1表示列。我们要是想通过索引来表示一个值,那么我们需要输入这个数字的行、列索引,行索引在前,列索引在后。具体方法是:数组名[行索引,列索引]。
具体实例如下:
import numpy as np
b = np.random.randn(4, 4)
print("b = ", b)
print("b[3, 3] = ", b[3, 3])
5.2 切片
切片在Python中的应用十分重要。切片的定义是在一个数组中,我们通过提取其中的一部分元素来形成一个新的数组。当使用Python列表对数组进行切片时,我们的得到数组是一个副本。为了获取某个数组的一个切片,我们通过以下方式:
arrays_name[start:stop:step]
上述方法表示,从索引start开始到索引stop(不包含),之间的步长是step。默认情况下,会分别设置为:start = 0、stop = 维度的大小和step = 1。
下面我们通过实例说明:
import numpy as np
a = np.arange(10)
print('a = ', a)
print('a[0:5] =', a[0: 5])
print('a[1:7:2]', a[1:7:2])
对于二维数组,切片也同样适用,不同的是,行和列需要分别定义。示例如下:
import numpy as np
a = np.random.randn(24).reshape(6, 4)
print('a = ')
print(a)
print('获取数组a的第三行数据:')
print(a[2, :])
print('获取数组a的第一列数据:')
print(a[:, 0])
对于二维数组还有很多有趣的操作,感兴趣的话,可以自己动手自我尝试一下。