简介
NumPy
是一个 Python
包。它代表 Numeric Python
。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。
Numeric
,即 NumPy
的前身,是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray
,它拥有一些额外的功能。 2005年,Travis Oliphant 通过将Numarray
的功能集成到 Numeric
包中来创建NumPy
包。 这个开源项目有很多贡献者。(这两段简介均是抄的,这种简介看看就行了,了解即可)
基本操作
创建数组(矩阵)
# 导入库
import numpy as np
import random
# 创建数组(矩阵)
a=np.array([1,2,3,4,5])
b=np.array(range(1,6))
c=np.arange(1,6)
print(a)
print(b)
print(c)
效果
说明
我们有两个方法创建数组
np.arrray()
:这种方法我们要事先把数组的所有元素及数组的形状都准备好,调用这个方法只是转化。np.arange()
:这种方法简单一些,但是有很多的局限性,比如只能创建一维的数组,数组元素不能随性所欲的指定。
数组类型及Numpy数据类型
查看数组类型
我们可以用type(a)
查看a
的类型,都是numpy.ndarray
。
NumPy - Ndarray 对象
NumPy
中定义的最重要的对象是称为 ndarray
的 N 维数组类型。 它描述相同类型的元素集合。 可以使用基于零的索引访问集合中的项目。
ndarray
中的每个元素在内存中使用相同大小的块。ndarray
中的每个元素是数据类型对象的对象(称为 dtype
)。
从ndarray
对象提取的任何元素(通过切片)由一个数组标量类型的 Python
对象表示。 下图显示了ndarray
,数据类型对象(dtype
)和数组标量类型之间的关系。(额,这些也是抄的,图就懒得抄过来了,看看即可)
Numpy数据类型
可以用dtype
查看数组的元素类型,例如a.type
查看数组a
的元素类型
数据类型大致和C差不多,就是多个complex
复数类型。
数组形状
很多都是概念性质的,没什么好讲解的(要讲解的都写了注释),直接上代码,简单明了
查看数组形状
# 导入库
import numpy as np
# 查看数组的形状
a=np.array([[1,2,3],[4,5,6]])
print(a)
print(a.shape)
修改数组形状
# 导入库
import numpy as np
# 修改数组的形状
# pay attention:这里的修改并没有改变原数组,调用reshape只是返回了修改后的值,若要保留修改后的值只能拿一个新的数组去接收
print(a.reshape(1,6))
print("*"*30)
print(a)
reshape的使用
# 导入库
import numpy as np
# 创建时直接指定数组形状
a=np.arange(24).reshape(4,6)
print(a)
将数组展开
# 导入库
import numpy as np
# 将数组展开,也就是变化成一维数组
# 同样地,这里并没有修改原数组形状。像这样有返回值的方法一般都不会修改元原数组。
print(a.flatten())
print(a)
还有很多,这里就不一一讲解介绍了,我们只需要了解最基本的即可,其他的用到了去Google即可,不然会搞的自己刚开始学就很累很不知所措,不要过于完美主义。
数组运算
数组和数运算
# 数组和数的运算
a=np.arange(12).reshape(2,6)
print(a)
print("-"*30)
print(a+1)
print("-"*30)
print(a*3)
# 这是numpy的广播机制,运算过程中,加减乘除的值被运算到每一个元素上
同形状的数组之间运算
# 同形状的数组之间的运算
a=np.arange(24).reshape(4,6)
b=np.arange(100,124).reshape(4,6)
print(a)
print("-"*40)
print(b)
print("-"*40)
print(a+b)
print("-"*40)
print(a*b)
# 同形状的数组,对应的位置的元素直接运算即可
不同形状数组之间运算
# 不同形状的数组相加减
# 二行六列和一行六列
a=np.arange(12).reshape(2,6)
b=np.arange(6)
print(a.shape)
print(b.shape)
print("-"*30)
print(a)
print("-"*30)
print(b)
print("-"*30)
print(a-b)
print("-"*30)
print(a*b)
# 不同形状的数组相加减
# 二行六列和二行一列
a=np.arange(1,13).reshape(2,6)
b=np.arange(1,3).reshape(2,1)
print(a.shape)
print(b.shape)
print("-"*30)
print(a)
print("-"*30)
print(b)
print("-"*30)
print(a-b)
print("-"*30)
print(a*b)
# 不同形状的数组相加减
# 3*3*2和3#2
a=np.arange(18).reshape(3,3,2)
b=np.arange(6).reshape(3,2)
print(a.shape)
print(b.shape)
print("-"*30)
print(a)
print("-"*30)
print(b)
print("-"*30)
print(a-b)
print("-"*30)
print(a*b)
# 不同形状的数组相加减
# 3*3*2和3#3
# 这两个形状的数组不能进行计算
a=np.arange(18).reshape(3,3,2)
b=np.arange(9).reshape(3,3)
print(a.shape)
print(b.shape)
print("-"*30)
print(a)
print("-"*30)
print(b)
print("-"*30)
print(a-b)
print("-"*30)
print(a*b)
# 这两个数组之间不能运算,这段代码执行会报错
总结
广播原则:如果两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相符或其中一方的长度是1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
总结
初学者可以看看这篇文章,写的很详细。但是吧…,内容确实有点多,容易一开始就劝退,而且不太好让初学者接受,容易让人学的糊里糊涂的。
我的建议是:初学者可以就先了解最基本最常用的用法,不用把所有的都弄清楚明白。先大致把知识点过一遍,有个印象,以后实际用的时候自然会熟练的。