科学计算库NumPy

科学计算库NumPy

1、NumPy数组对象

1.1、NumPy特点

N维数组对象,即ndarry(别名array)对象,该对象具有矢量算术能力和复杂的广播能力,可以执行一些科学计算,ndarry对象拥有对高维数组的处理能力。

ndarray对象的常用属性:

属性具体说明
ndarray.ndim维度个数,也就是数组轴的个数,比如一维、二维等
ndarray.shape数组的维度,这是一个整数的元组,表示每个维度上数组的大小。例如,一个n行和m列的数组,它的shape属性为(n,m)
ndarray.size数组元素的总个数,等于shape属性中元组元素的乘积
ndarray.dtype描述数组中元素类型的对象,既可以使用标准的Python类型创建或指定,也可以使用NumPy特有的数据类型来指定,比如int32,float64等
ndarray.itemsize数组的每个元素的字节大小,比如int32的数组有4个字节(32/8)
data = np.arange(12).reshape(3,4)	 # 创建一个3行4列的数组
data.ndim   # 数组的维度个数,输出结果2,表示二维数组
data.shape  # 数组的维度,输出结果(3,4),表示3行4列
data.size   # 数组元素的个数,输出结果12,表示总共12个元素
data.dtype  # 数组元素的类型,输出结果dtype('int32'),表示元素类型都是int32

2、创建NumPy数组

data1 = np.array([1,2,3])   # 创建一个一维数组
data2 = np.array([[1,2,3],[4,5,6]]) # 创建一个二维数组

(1)通过zeros()函数创建元素值都为0的数组

np.zeros((3,4))

(2)通过ones()函数创建元素值都为1的数组

np.ones((3,4))

(3)通过empty()函数创建一个新的数组,该数组只分配了内存空间,它里面填充的元素都是随机的,默认为float类型

np.empty((5,2))

(4)通过arange()函数创建一个等差数组

np.arange(1,20,5)

注意:默认情况下,通过zeros()、ones()、empty()函数创建的数组中数据类型为float64

3、ndarray对象的数据类型

3.1、查看数据类型

通过name属性进行获取

data = np.array([[1,2,3],[4,5,6]])
data.dtype.name

注意:在默认情况下,64位Windows系统输出的结果为int32,64位Linux或Mac OS系统输出结果为int64

NumPy中常用的数据类型:

数据类型含义
bool布尔类型,值为True或False
int8、unit8有符号和无符号的8为整数(同理16位、32位、64位)
float16半精度浮点数16位(同理32位、64位)
complex64复数,分别用两个32位浮点数表示实部和虚部
complex128复数,分别用两个64位浮点数表示实部和虚部
3.2、数据类型转换

ndarray对象的数据类型可以通过astype()方法进行转换

data = np.array([[1,2,3],[4,5,6]])
float_data = data.astype(np.float64)    # 数据类型转换为float64
float_data.dtype

4、数组运算

4.1、矢量化运算

NumPy中,大小相等的数组之间的任何算数运算都会应用到元素级,即只用于位置相同的元素之间,所得的运算结果组成一个新的数组。

data1 = np.array([[1,2,3],[4,5,6]])
data2 = np.array([[1,2,3],[4,5,6]])
data1+data2
# 运算结果为:array([[2,3,6],[8,10,12]])
4.2、数组广播

数组在进行矢量化运算时,要求数组的形状是相等的。当形状不相等的数组执行算术运算的时候,就会出现广播机制,该机制会对数组进行扩展,使数组的shape属性值一样,这样就可以进行矢量运算了。

arr1  = np.array([[0],[1],[2],[3]])
arr1.shape		# (4,1)
arr2 =np.array([1,2,3])
arr2.shape		# (3,)
arr1 + arr2
# array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]])

注意:广播机制实现了对两个或两个以上的数组运算,即使这些数组的shape不是完全相同的,只需要满足如下任意一个条件即可:

​ (1)数组的某一维度等长

​ (2)其中一个数组的某一维度为1

​ 广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。

4.3、数组与标量间的运算

大小相等的数组之间的任何算术运算都会将运算应用到元素级,同样,数组与标量的算数运算也会将那个标量值传播到各个元素。当数组进行相加、相减、乘以或除以一个数字时,这些称为标量运算。标量运算会产生一个与数组具有相同数量的行和列的新矩阵,其原始矩阵的每个元素都被相加、相减等。

data1 = np.array([[1,2,3],[4,5,6]])
data2 = 10
data1 + data2
# 计算结果:array([[11,12,13],[14,15,16]])

5、ndarray的索引和切片

1、一维数组:

arr = np.arange(8)    # 创建一个一维数组
arr[5]  # 获取索引为5的元素
arr[3:5]    # 获取索引为3~5的元素,但不包括5
arr[1:6:2]    # 获取索引为1~6的元素,步长为2

2、二维数组:

arr2 = np.array([[1,2,3],[4,5,6],[7,8,9]])    # 创建二维数组
arr2[1]    # 获取索引为1的元素  array([4,5,6])
arr2[0,1]   # 获取第0行第1列的元素	2
arr2[:2]	# array([1,2,3],[4,5,6])
arr2[0:2,0:2]	# array([1,2],[4,5])
arr2[1,:2]	# array([4,5])

6、数组的转置与轴对称

将数组中每个元素按照一定的规则进行位置变换,transpose()方法和T属性两种实现方式。例如:3行4列的二维数组,T属性转置后形成4行3列的新数组。

arr = np.arange(12).reshape(3,4)
# array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
arr.T   # 使用T属性对数组进行转置
# array([0,4,8],[1,5,9],[2,6,10],[3,7,11])

7、NumPy通用函数

一元通用函数:

arr = np.array([4,9,16])
np.sqrt(arr)    # 计算数组元素的平方根	array([2.0,3.0,4.0])
np.abs(arr)   # 计算数组元素的绝对值	array([4,9,16])
np.square(arr)  # 计算数组元素的平方  array([16,81,256])

二元通用函数:

x = np.array([12, 9, 13, 15])
y = np.array([11, 10, 4, 8])
np.add(x, y)    # 计算两个数组的和	array([23,19,17,23])
np.subtract(x,y)    # 计算两个数组的差 array([1,-1,9,7])
np.multiply(x, y)  # 计算两个数组的乘积	array([132,90,52,120])
np.maximum(x, y)  # 两个数组元素级最大值的比较  array(12,10,13,15)
np.greater(x,y)   # 执行元素级的比较操作	array([True,False,True,True])

8、利用NumPy数组进行数据处理

8.1、将条件逻辑转为数组运算

NumPy的where()函数是三元表达式x if condition else y 的矢量化版本。

x = np.array([1,5,7])
y = np.array([2,6,8])
con = np.array([True,False,True])
np.where(con,x,y)  # con为真时,取x值,反之,取y值 array([1,6,7])
8.2、数组统计运算

NumPy数组中与统计运算相关的方法:

方法描述
sum对数组中全部或某个轴向的元素求和
mean算术平均值
min计算数组中的最小值
max计算数组中的最大值
argmin表示最小值的索引
argmax表示最大值的索引
cumsum所有元素的累计和
cumprod所有元素的累计积
arr = np.arange(10)
arr.sum()   # 求和 45
arr.mean()  # 求平均值 4.5
arr.min()   # 求最小值 0
arr.max()   # 求最大值 9
arr.argmin()   # 求最小值的索引 0
arr.argmax()   # 求最大值的索引 9
arr.cumsum()   # 计算元素的累计和 array([0,1,3,6,10,15,21,28,36,45])
arr.cumprod()   # 计算元素的累计积 array([0,0,0,0,0,0,0,0,0,0])
8.3、数组排序

通过sort()函数实现从小到大排序

arr=np.array([[6,2,7],[3,6,2],[4,3,2]])
arr.sort()	# array([[2,6,7],[2,3,6],[2,3,4]])

注意:使用sort()函数排序会修改数组本身,如果希望对某一轴上的元素进行排序,需将轴的编号传入sort()函数。

arr.sort(0)	# array([[3,2,2],[4,3,2],[6,6,7]])
8.4、检索数组元素

all()函数全真为True,any()函数有真即为True。

arr = np.array([[1, -2, -7], [-3, 6, 2], [-4, 3, 2]])
np.any(arr > 0)  # 判断是否有一个大于0  True
np.all(arr > 0)  # 判断是否所有元素都大于0  False
8.5、唯一化及其他集合逻辑

一维数组中,unique()函数找出数组中的唯一值,并返回有序结果

arr = np.array([12, 11, 34, 23, 12, 8, 11])
np.unique(arr)	# array([8,11,12,23,34])

in1d()函数判断元素是否存在数组中,返回布尔型数组

np.in1d(arr,[11,12])
# array([True,True,False,False,True,False,True])

数组集合运算的常见函数:

函数描述
unique(x)计算x中的唯一元素,并返回有序结果
intersect1d(x,y)计算x和y的交集,返回有序结果
union1d(x,y)计算x和y的并集,返回有序结果
in1d(x,y)返回一个“x的元素是否包含y”的布尔型数组

9、随机数模块

random模块的常见函数:

函数描述
seed生成随机数的种子
rand产生均匀分布的样本值
randint从给定的上下限范围内随机选取整数
normal产生正态分布的样本值
beta产生Beta分布的样本值
uniform产生在【0,1】中均匀分布的样本值
np.random.seed()	# 生成随机数种子
np.random.rand(5)	# 随机生成5个元素的浮点型数组

注意:seed()函数使随机数具有预见性,当传入的参数相同时,每次生成的随机数相同。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值