python有着大量的功能强大的第三方库,这些第三方库的=可以大大的扩充python的功能,我们在实际使用过程中往往也离不开这些第三方库。
numpy是python的一种开源的数值计算扩展,这种工具可用来储存的处理大型矩阵,比python本身的嵌套列表结构要高效的多numpy提供了许多高级的数值编程工具。其中一个重要的特性就是他的数组计算;
在学习numpy之前我们先考虑这样的一个问题,我们拥有两个数值列表,现在想要使得列表中的每一个元素对应位置相加。我们首先能想到的是使用for循环实现这一操作:
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
c = []
for i in range(0, len(a)):
c.append(a[i] + b[i])
print(c) # output:[6, 8, 10, 12]
也可以使用列表生成式实现
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
c = [x + y for (x, y) in zip(a, b)]
print(c)
上面的代码已经是相当简洁了,但是在我们使用numpy时,实现改操作将更为简洁:
a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
c = a + b
print(c) output:[ 6 8 10 12]
每一个元素加一可以使用:
a = np.array([1, 2, 3, 4])
c = a + 1
名称 | 描述 |
---|---|
bool_ | 布尔型数据类型(True 或者 False) |
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
int8 | 字节(-128 to 127) |
int16 | 整数(-32768 to 32767) |
int32 | 整数(-2147483648 to 2147483647) |
int64 | 整数(-9223372036854775808 to 9223372036854775807) |
uint8 | 无符号整数(0 to 255) |
uint16 | 无符号整数(0 to 65535) |
uint32 | 无符号整数(0 to 4294967295) |
uint64 | 无符号整数(0 to 18446744073709551615) |
float_ | float64 类型的简写 |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ | complex128 类型的简写,即 128 位复数 |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
注意
数组的数据类型在数组创建时就定义了,但是可以使用astype函数转换dtype
float_arr=arr.astype(np.float64)
创建形式 | 函数方法 |
---|---|
创建一个指定形状的数组 | numpy.empty(shape, dtype = float, order = ‘C’) |
从列表产生数组 | np.array(list) |
从列表传入 | np.array([1, 2, 3, 4]) |
创建元素全为0的数组 | numpy.zeros(shape, dtype = float, order = ‘C’) |
创建元素全为1的数组 | numpy.ones(shape, dtype = None, order = ‘C’) |
从已有的数组创建数组 | numpy.asarray(a, dtype = None, order = None) |
从数值范围创建数组 | numpy.arange(start, stop, step, dtype) |
将数组的元素设置为指定数值 | ndarray.fill(value) |
生成等差数列 | numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)[source] |
生成[0, 1)的随机数数组 | numpy.random.rand(shape) |
生成标准正泰分布的随机数的数组 | numpy.random.randn(shape) |
生成正整数的随机数组 | numpy.random.randint(low, high=None, size=None, dtype=int) |
上面方法的参数说明
参数 | 描述 |
---|---|
shape | 数组形状 |
dtype | 数据类型,可选 |
order | 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序 |
a | 任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组 |
start | 起始值,默认为0 |
stop | 终止值(不包含) |
step | 步长,默认为1 |
dtype | 返回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 | 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性 |
查看数组类型
type(a)
查看数组内数据的类型
a.dtype()
一维数组的索引与列表类似,相关操作参考列表
a = np.array([1, 2, 3, 4, 5])
索引
# 索引,支持负索引
a[0]
# 索引修改
a[0] = 5
切片
a[1:3]
a = np.array([range(0, 6), range(6, 12), range(12, 18), range(18, 24), range(24, 30)])
索引
# 索引得到某个元素
a[1, 3] # a[行值, 列值]
# 索引得到某行元素
a[1] # a[行值]
# 索引得到某列元素
a[:,3] # a[:,列值]
切片
a[起始行数:终止行数:步长, 起始列数:终止列数:步长] # 均为半开半闭的区间
切片在内存中使用的是引用机制;
引用机制意味着,python并没有为切片所得的值分配新的空间来储存它的值,而是让其指向了原数组的内存空间,因此改变索引的值将会改变原数组;
避免修改原数组的方法是使用copy()方法产生一个复制,这个复制会重新开辟一个新的内存空间;
列表的切片不存在这个问题;
切片只能支持连续或者间隔的切片操作,要想实现任意位置的操作,需要使用花式索引:
a = np.array(range(0, 15))
花式索引需要指定索引位置
index = [1, 2, -3]
a[index]
使用布尔数组来花式索引
a = np.array(range(0, 15))
bool = np.array([0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0], dtype=bool)
a[bool]
a = np.array([range(0, 6), range(6, 12), range(12, 18), range(18, 24), range(24, 30), range(30, 36)])
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]
[24 25 26 27 28 29]
[30 31 32 33 34 35]]
获取次对角线上的5个值
a[(0, 1, 2, 3, 4), (1, 2, 3, 4, 5)] # a[(行值), (列值)]
使用布尔数组来花式索引
与一维数组的操作相同
a = np.array([1, 3, 13, 23, 1, 5])
a[a > 10] # 返回a中大于10的所有元素
np.where(a > 10) # 返回满足条件的索引值
如果两个数组 a 和 b 形状相同,即满足 a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同
当运算中的 2 个数组的形状不同时,numpy 将自动触发广播机制
a = np.array([[ 0, 0, 0],
[10,10,10],
[20,20,20],
[30,30,30]])
b = np.array([1,2,3])
print(a + b)
函数 | 描述 |
---|---|
numpy.reshape(arr, newshape, order=‘C’) | 不改变数据的条件下修改形状 |
numpy.ndarray.flat | 数组元素迭代器 |
ndarray.flatten(order=‘C’) | 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组 |
numpy.ravel(a, order=‘C’) | 返回展开数组 |
函数 | 描述 |
---|---|
numpy.transpose(arr, axes) | 对换数组的维度 |
ndarray.T | 和 self.transpose() 相同 |
numpy.rollaxis(arr, axis, start) | 向后滚动指定的轴 |
numpy.swapaxes(arr, axis1, axis2) | 对换数组的两个轴 |
函数 | 描述 |
---|---|
broadcast | 产生模仿广播的对象 |
broadcast_to | 将数组广播到新形状 |
expand_dims | 扩展数组的形状 |
squeeze | 从数组的形状中删除一维条目 |
函数 | 描述 |
---|---|
concatenate | 连接沿现有轴的数组序列 |
stack | 沿着新的轴加入一系列数组。 |
hstack | 水平堆叠序列中的数组(列方向) |
vstack | 竖直堆叠序列中的数组(行方向) |
函数 | 描述 |
---|---|
split | 将一个数组分割为多个子数组 |
hsplit | 将一个数组水平分割为多个子数组(按列) |
vsplit | 将一个数组垂直分割为多个子数组(按行) |
函数 | 描述 |
---|---|
resize | 返回指定形状的新数组 |
append | 将值添加到数组末尾 |
insert | 沿指定轴将值插入到指定下标之前 |
delete | 删掉某个轴的子数组,并返回删除后的新数组 |
unique | 查找数组内的唯一元素 |
sort函数
argsort函数