python数据科学手册笔记——Numpy

作者: ls_本性
专题简介:本文章将介绍python中Numpy库常用的操作。
😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍

Numpy与列表的关系

列表是用C语言编写的但是,其中的元素的类别没有限制,所有导致如果列表中的元素相同时,使用列表做操作不仅耗空间也耗时间。因此有了numpy(numpy中的元素必须是同一种类型)

Numpy基础操作

创建数组

如果数据类型不同numpy会向上转化(如果可行)

In[9]: np.array([3.14, 4, 2, 3])
Out[9]: array([ 3.14,  4.  ,  2.  ,  3. ])

创造指定类别的数组

In[10]: np.array([1, 2, 3, 4], dtype='float32')
Out[10]: array([1., 2., 3., 4.], dtype=float32)

利用嵌套列表构建多维数组

In[11]:np.array([range(i, i + 3) for i in [2, 4, 6]])
Out[11]: array([[2, 3, 4],
                [4, 5, 6],
                [6, 7, 8]])

一些常见的数组

In[12]: # 创建一个长度为10的数组,数组的值都是0
        np.zeros(10, dtype=int)
Out[12]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
In[13]: # 创建一个3×5的浮点型数组,数组的值都是1
        np.ones((3, 5), dtype=float)
Out[13]: array([[ 1.,  1.,  1.,  1.,  1.],
                [ 1.,  1.,  1.,  1.,  1.],
                [ 1.,  1.,  1.,  1.,  1.]])
In[14]: # 创建一个3×5的浮点型数组,数组的值都是3.14
        np.full((3, 5), 3.14)
Out[14]: array([[ 3.14,  3.14,  3.14,  3.14,  3.14],
                [ 3.14,  3.14,  3.14,  3.14,  3.14],
                [ 3.14,  3.14,  3.14,  3.14, 3.14]])[20]: # 创建一个3×3的单位矩阵
        np.eye(3)
Out[20]: array([[ 1.,  0.,  0.],
                [ 0.,  1.,  0.],
                [ 0.,  0.,  1.]])

等差数组

In[15]: # 创建一个3×5的浮点型数组,数组的值是一个线性序列
        # 从0开始,到20结束,步长为2
        # (它和内置的range()函数类似)
        np.arange(0, 20, 2)
Out[15]: array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
In[16]: # 创建一个5个元素的数组,这5个数均匀地分配到0~1
        np.linspace(0, 1, 5)
Out[16]: array([ 0.  ,  0.25,  0.5 ,  0.75,  1. ])

随机生成数组

#随机种子
In [3]: np.random.seed(111)
#生成一个2x2,在1~4均匀分布的数组
In [4]: np.random.uniform(1,4,(2,2))
Out[4]:array([[2.83651053, 1.50720926],
       [2.30817706, 3.30778742]])
#生产一个2x2,均值0,方差1的正态分布数组
In [8]: np.random.normal(0,1,(2,2))
Out[8]:array([[-1.30357043,  0.178105  ],
       [-0.33440236, -0.30602713]])
#生产一个2x2,范围为(-8~+8)的整数的数组
In [9]: np.random.randint(-8,8,(2,2))
Out[9]:array([[ 1, -8],
       [-6, -1]])
数组的常见属性
In [17]: x=np.random.randint(0,8,size=(3,3))

In [18]: x
Out[18]:array([[5, 7, 6],
       [0, 4, 6],
       [0, 4, 4]])
# nidm(数组的维度)、shape(数组每个维度的大小)和size(数组的总大小)属性:
In [22]: x.ndim
Out[22]: 2
In [24]: x.shape
Out[24]: (3, 3)
In [25]: x.size
Out[25]: 9
#查看数组内数据的数据类型
In [26]: x.dtype
int32
#查看单字节大小和总字节大小
In [27]: x.itemsize
Out[27]: 4
In [28]: x.nbytes
Out[28]: 36
数组的索引

索引的下标从0开始

x=  np.array([1,2,3,4,5])
print(x[0],x[-1])
out:1 5

在多维数组中,可以用逗号分隔的索引元组获取元素:

In[10]: x2
Out[10]: array([[3, 5, 2, 4],
		[7, 6, 8, 8],
		[1, 6, 7, 7]])
In[11]: x2[0, 0]
Out[11]: 3
In[12]: x2[2, 0]
Out[12]: 1

请注意,和 Python 列表不同,NumPy 数组是固定类型的。这意味着当 你试图将一个浮点值插入一个整型数组时,浮点值会被截短成整型。并 且这种截短是自动完成的,不会给你提示或警告,所以需要特别注意这 一点!

In[15]: x1[0] = 3.14159 # 这将被截短
x1
Out[15]: array([3, 0, 3, 3, 7, 9])
数组切片

切片的格式:

x[start:stop:step]

注意末尾是开区间,取不到

多维切片也采用同样的方式处理,用冒号分隔。

In[24]: x2=array([[12, 5, 2, 4],
		[ 7, 6, 8, 8],
		[ 1, 6, 7, 7]])
In[25]: x2[:2, :3] # 两行,三列
Out[25]: array([[12, 5, 2],
[ 7, 6, 8]])

获取数组的某一行/列

In[28]: print(x2[:, 0]) # x2的第一列
[12 7 1]
In[29]: print(x2[0, :]) # x2的第一行
[12 5 2 4]
#获取行可以简化为
print(x2[0]) #列不能简化
子数组的非副本视图

值得注意的是,在narray数组中使用切片返回的是原数组的视图,而不是数值数据的副本(在同一个地址上绑定了二个变量名)。而在列表中切片返回的是原数组的副本(把原数组重新的在另一个地址复制了一次)

创建数组副本
In[35]: x2_sub_copy = x2[:2, :2].copy()
print(x2_sub_copy)
	[[99 5]
	[ 7 6]]

此时修改此数组原数组不会有改变。

数组的变形
grid=np.arange(1,10).reshape((3,3))
grid
out:[[1 2 3]
[4 5 6]
[7 8 9]]

reshape 方法将会用到原始数组的一 个非副本视图。但实际情况是,在非连续的数据缓存的情况下,返回非 副本视图往往不可能实现。

将一维数组升成二维

In[39]: x = np.array([1, 2, 3])
# 通过变形获得的行向量
x.reshape((1, 3))
Out[39]: array([[1, 2, 3]])
In[40]: # 通过newaxis获得的行向量
x[np.newaxis, :]  #x[None, :]有着一样的效果
Out[40]: array([[1, 2, 3]])
In[41]: # 通过变形获得的列向量
x.reshape((3, 1))
Out[41]: array([[1],
				[2],
				[3]])
In[42]: # 通过newaxis获得的列向量
x[:, np.newaxis]
Out[42]: array([[1],
				[2],
				[3]])
数组的拼接

拼接或连接 NumPy 中的两个数组主要由 np.concatenate、np.vstack 和 np.hstack 例程实

In[43]: x = np.array([1, 2, 3])
y = np.array([3, 2, 1])
np.concatenate([x, y])
Out[43]: array([1, 2, 3, 3, 2, 1])
In[44]: z = [99, 99, 99]
print(np.concatenate([x, y, z]))
[ 1 2 3 3 2 1 99 99 99]

np.concatenate 也可以用于二维数组的拼接(默认按行拼接):

In[45]: grid = np.array([[1, 2, 3],
[4, 5, 6]])
In[46]: # 沿着第一个轴拼接
np.concatenate([grid, grid])
Out[46]: array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])
In[47]: # 沿着第二个轴拼接(从0开始索引)
np.concatenate([grid, grid], axis=1)
Out[47]: array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])

沿着固定维度处理数组时,使用 np.vstack(垂直栈)和 np.hstack(水平栈)函数会更简洁:

In[48]: x = np.array([1, 2, 3])
grid = np.array([[9, 8, 7],
[6, 5, 4]])
# 垂直栈数组
np.vstack([x, grid])
Out[48]: array([[1, 2, 3],
[9, 8, 7],
[6, 5, 4]])
In[49]: # 水平栈数组
y = np.array([[99],
[99]])
np.hstack([grid, y])
Out[49]: array([[ 9, 8, 7, 99],
[ 6, 5, 4, 99]])

与之类似,np.dstack 将沿着第三个维度拼接数组。

数组的分列

与拼接相反的过程是分裂。分裂可以通过 np.split、np.hsplit 和 np.vsplit 函数来实现。可以向以上函数传递一个索引列表作 为参数,索引列表记录的是分裂点位置:

In[50]: x = [1, 2, 3, 99, 99, 3, 2, 1]
x1, x2, x3 = np.split(x, [3, 5])
print(x1, x2, x3)
[1 2 3] [99 99] [3 2 1]

值得注意的是,N 分裂点会得到 N + 1 个子数组。相关的 np.hsplit 和 np.vsplit 的用法也类似.

基本数学函数

一些三角函数

In[15]: theta = np.linspace(0, np.pi, 3)
In[16]: print("theta = ", theta)
print("sin(theta) = ", np.sin(theta))
print("cos(theta) = ", np.cos(theta))
print("tan(theta) = ", np.tan(theta))
print("arcsin(x) = ", np.arcsin(x))
print("arccos(x) = ", np.arccos(x))
print("arctan(x) = ", np.arctan(x))

用np.pi才能得到 π \pi π较为精确的值

指数对数函数

In[18]: x = [1, 2, 3]
print("x =", x)
print("e^x =", np.exp(x))
print("2^x =", np.exp2(x)) #相当于2^x
print("3^x =", np.power(3, x))
In[19]: x = [1, 2, 4, 10]
print("x =", x)
print("ln(x) =", np.log(x))#以e为底
print("log2(x) =", np.log2(x))
print("log10(x) =", np.log10(x))

函数np.expm1,np.log1p,对于一些很小的输入值有着比np.exp,np.log更好的精度。

在scipy.special模块中存在着一些数学专用的函数。

高级通用函数

reduce一个 reduce 方法 会对给定的元素和操作重复执行,直至得到单个的结果。如果需要存储每次计算的中间结果,可以使用 accumulate。

In[26]: x = np.arange(1, 6)
np.add.reduce(x)
Out[26]: 15
In[28]: np.add.accumulate(x)
Out[28]: array([ 1, 3, 6, 10, 15])
聚合函数

和许多其他语言一些numpy存在自己的聚合函数(np.min,np.max…),但是相对于python自带的聚合函数来说,numpy所提供的聚合函数更快,而且支持多维数组运算。

在这里插入图片描述

布尔运算

and,or 是条件判断条件运算,一般作用于单个布尔运算,^,|运算是比特运算 ,对一个对象的内容(单个比特或字节)执行多个布尔运算。对于 NumPy 布尔数组,后者是常用的操作

参考资料:
python数据科学手册

  • 31
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值