我用的是anaconda自带spyder写代码的。anconda是一款免费的集成开发环境,而且自带了numpy等数据分析模块,推荐给大家。
数组对象ndarray简介
之前我的文章中介绍过Python的列表,当时就说和数组挺像的,唯一的不同是列表内部的元素可以是不同的类型,比如字符串和整数同时存在在一个列表中是可以的。而数组类似于C语言的数组,只支持一种类型元素在一个数组中。
我们先来体验一下数组:
# -*- coding: utf-8 -*-
import numpy as np
def nusum():
a=np.array([0,1,2,3,4])
b=np.array([9,8,7,6,5])
c=a**2+b**3
return c
print(nusum())
执行结果
[729 513 347 225 141]
可以看到执行结果也是一个数组
numpy引入数组的好处是显而易见的:
- 更容易优化,提升运算速度,numpy底层就是C语言写的
- 使一维数组更像单个数据,不必用循环语句来运算,就比如上例,我们不用用for来挨个运算。
进一步了解ndarray,他由两部分构成
- 实际的数据
- 描述这些数据的元数据(数据维度,数据类型)
ndarray生成的数组每一个中括号我们称之为轴(axis),一个轴实际上就是一个维度,同理我们把维度称为秩(rank),这里的理解和线性代数里面的矩阵一致。
ndarray对象属性
属性 | 说明 |
.nidm | 维度,即秩 |
.shape | 对象的尺度,就是矩阵的规模,n*m |
.size | 元素的个数 |
.dtype | 元素类型 |
.itemsize | 每个元素的大小,单位是字节 |
ndarray数组的创建方法
- 从列表,元组等类型创建ndarray数组:
直接调用array函数即可,比如
x=np.array(a,dtype=np.int32)
如果第二个类型参数你没写,python会自动给你加上一个适合的类型。
2. 使用numpy自带的函数创建数组,比如:
函数 | 说明 |
np.arange(n) | 生成一个从0-n-1的数组,返回一个ndarray |
np.ones(shape) | 返回一个全是1的数组 |
np.zeros(shape) | 返回一个全是0的数组 |
np.full(shape,val) | 返回一个全是val数值的的数组 |
np.eye(n) | 返回一个n*n的矩阵,对角线为1,其余为0的数组 |
np.ones_like(a) | 生成一个和数组a形状一样数组,元素全为1,同样的函数还有zeros_like()和full_like(a,val) |
np.linspace() | 在前两个参数范围里,等距离生成第三个参数数目的元素形成数组 |
np.concatenate | 合并多个数组 |
还有一些对数组维度变换的函数:
方法 | 说明 |
.reshape(shape) | 会返回一个shape形状的数组,元素不变,原数组不变 |
.resize(shape) | 与reshape功能相同,但是会直接修改原数组 |
.swapaxes(ax1,ax2) | 将两个维度调换 |
.flatten() | 将数组降成一维,原数组不变 |
ndarray数组的操作
索引:
- 一维数组:索引和列表类似,直接引用下标即可;
- 多维数组:我们先创建一个数组,通过实例体会
a=np.arange(24).reshape((2,3,4))
结果:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
当我们输入a[1,2,3],返回23。这里我们就知道和一维数组类似,和数学中的矩阵索引也类似(array中索引从0开始,线代中是从1开始的)。
切片:
- 一维数组:的切片也和列表类似,例如a[1:4:2]代表从第二个元素到第四个元素,左闭右开,步长为2的a数组的子集。我们重点讨论非一维数组,
- 多维数组:同样一维数组切片类似,我们使用冒号来表示
a[:,1,:-2]
返回
array([[ 4, 5],
[16, 17]])
第一个维度两边是空的,所以取了第一个维度所有值;第二个维度是1,所有只要每个维度第二行的元素;第三个维度是:-2,所有输出从第一到倒数第二个元素之前的元素。这里我建议你多尝试几次,通过实践体会切片。三维以上的切片我们就很难有直观的理解了,这里也不深入了。
数组的运算
- 数组与标量运算等价于数组的所有元素与它运算。
- 还有很多函数,比如取绝对值,开平方,我的想法是不用记,在实战中遇到你需要的你可以去查阅,慢慢常用的就能记住了。
尾声
这篇文章介绍了numpy库中基本数组的知识,后续我会通过一个项目融汇贯通numpy库的所有知识。