首页 > 上网技巧 > 手把手教你用Python的NumPy包处理数据

手把手教你用Python的NumPy包处理数据

时间:2021-09-24 12:43 作者:QQ地带 我要评论

如果你已经安装了Anaconda,那么就假设你已经在虚拟环境中安装了NumPy。如果你使用过Python的标准发行版或任何其他发行版,你可以访问
 
http://www.numpy.org
 
并按照所提供的安装说明进行操作。
 
01 导入NumPy
 
一旦启动了一个新的IPython或者Jupyter会话,就可以导入Numpy模块并按照以下步骤来验证版本:
 
importnumpy
 
numpy.__version__
 
输出结果:
 
1.15.4
 
提示:记得在Jupyter Notebook中,键入命令后,你可以按下Ctrl+Enter,以执行一个单元格。或者,按下Shift+Enter以执行单元格,并自动插入或者选择该单元格下面的单元格。依次单击Help | Keyboard Shortcut以检查所有的键盘快捷键,或者依次单击Help | User Interface Tour以进行快速浏览。
 
此处讨论的部分包,建议使用NumPy 1.8版本或后续版本。按照惯例,你会发现在科学Python领域中,大多数人导入NumPy都会使用np作为别名:
 
importnumpy asnp
 
np.__version__
 
输出结果:
 
1.15.4
 
02 理解NumPy数组
 
Python是一种弱类型的语言。这就意味着, 你无论何时创建一个新变量,都不必指定数据类型。例如,下面的内容将自动表示为一个整数:
 
a = 5
 
输入下面内容以再次确认:
 
type(a)
 
输出结果:
 
int
 
注意:因为标准Python实现是用C编写的,所以每个Python对象本质上是一个伪C结构。这对于Python中的整数也是如此,实际上它是指向复合C结构的指针,包含的不仅仅是原始整数值。因此,用于表示Python整数的默认C数据类型将依赖于你的系统架构(即系统是32位还是64位平台)。
 
更进一步,我们使用list命令可以创建一个整数列表,这是Python中的标准多元素容器。range (x)函数将创建从0到x–1的所有整数。要输出变量,你可以使用print函数,也可以直接输入变量名字并按Enter:
 
int_list = list(range( 10))
 
int_list
 
输出结果:
 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 
类似地,我们通过让Python遍历整数列表int_list中的所有元素,并对每个元素应用str函数(该函数将一个数转换成一个字符串),来创建一个字符串列表:
 
str_list = [str(i) fori inint_list]
 
str_list
 
输出结果:
 
[‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’]
 
可是,用列表进行数学运算并不是很灵活。例如,我们想要将int_list中的每个元素都乘以一个因子2。执行以下操作可能是一种简单的方法—看看输出结果是怎样的:
 
int_list * 2
 
输出结果:
 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 
Python创建了一个列表,其内容是int_list的所有元素生成了两次,这并不是我们想要的!
 
这就是NumPy的用武之地。NumPy是专为简化Python中的数组运算而设计的。我们可以快速将整数列表转换为一个NumPy数组:
 
importnumpy asnp
 
int_arr = np.array(int_list)
 
int_arr
 
输出结果:
 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
 
让我们看看试着将数组中的每个元素相乘会怎么样:
 
int_arr * 2
 
输出结果:
 
array([ 0 2 4 6 8 10 12 14 16 18])
 
这次我们做对了!加法、减法、除法以及很多其他运算也是同样的。
 
而且,每个NumPy数组都具有以下属性:
 
ndim:维数。
shape:每一维的大小。
size:数组中元素的总数。
dtype:数组的数据类型(例如int、float、string等)。
让我们来看看整数数组的上述属性:
 
print( “int_arr ndim: “, int_arr.ndim)
 
print( “int_arr shape: “, int_arr.shape)
 
print( “int_arr size: “, int_arr.size)
 
print( “int_arr dtype: “, int_arr.dtype)
 
输出结果:
 
int_arr ndim: 1
 
int_arr shape: (10,)
 
int_arr size: 10
 
int_arr dtype: int64
 
从这些输出中,我们可以看到我们的数组只包含一维,其包含10个元素且所有元素都是64位的整数。当然,如果你在32位机器上执行这段代码,你可能会得到dtype:int 32。
 
03 通过索引访问单个数组元素
 
如果你之前使用过Python的标准列表索引,那么你就不会发现NumPy中的索引有很多问题。在一维数组中,通过在方括号中指定所需的索引,可以访问第i个值(从0开始计算),与Python列表一样:
 
int_arr
 
输出结果:
 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
 
int_arr[ 0]
 
输出结果:
 
0
 
int_arr[ 3]
 
输出结果:
 
3
 
要从数组的末尾建立索引,可以使用负索引号:
 
int_arr[ -1]
 
输出结果:
 
9
 
int_arr[ -2]
 
输出结果:
 
8
 
切割数组还有一些其他很酷的技巧,如下所示:
 
int_arr[ 2: 5] #from index 2 up to index 5 – 1
 
输出结果:
 
array([2, 3, 4])
 
int_arr[: 5] #from the beginning up to index 5 – 1
 
输出结果:
 
array([0, 1, 2, 3, 4])
 
int_arr[ 5:] #from index 5 up to the end of the array
 
输出结果:
 
array([5, 6, 7, 8, 9])
 
int_arr[:: 2] #every other element
 
输出结果:
 
array([0, 2, 4, 6, 8])
 
int_arr[:: -1] #the entire array in reverse order
 
输出结果:
 
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
 
建议你自己尝试使用这些数组!
 
提示:NumPy中切割数组的一般形式与标准Python列表中的相同。使用x [start: stop: step]访问数组x中的一个片段。如果没有指定任何一个值,那么默认值为start=0、stop=size of dimension、step=1。
 
04 创建多维数组
 
数组不必局限于列表。实际上,数组可以有任意维数。在机器学习中,通常我们至少要处理二维数组,列索引表示特定的特征值,行包含实际的特征值。
 
使用NumPy可以轻松地从头开始创建多维数组。假设我们想要创建一个3行5列的数组,所有的元素都初始化为0。如果我们不指定数据类型,NumPy将默认使用float类型:
 
arr_2d = np.zeros(( 3, 5))
 
arr_2d
 
输出结果:
 
array([[0., 0., 0., 0., 0.],
 
[0., 0., 0., 0., 0.],
 
[0., 0., 0., 0., 0.]])
 
使用OpenCV时你可能就知道:这可以解释为所有像素设置为0(黑色)的一个3×5的灰度图像。例如,如果你想要创建具有3个颜色通道(R、G和B)2×4像素的一个小图像,但是所有像素都设置为白色,我们将使用NumPy创建一个3×2×4的三维数组:
 
arr_float_3d = np.ones(( 3, 2, 4))
 
arr_float_3d
 
输出结果:
 
array([[[1., 1., 1., 1.],
 
[1., 1., 1., 1.]],
 
[[1., 1., 1., 1.],
 
[1., 1., 1., 1.]],
 
[[1., 1., 1., 1.],
 
[1., 1., 1., 1.]]])
 
这里,第一维定义颜色通道(OpenCV中的蓝色、绿色和红色)。因此,如果这是真实的图像数据,我们可以通过切割数组轻松地获得第一个通道中的颜色信息:
 
arr_float_3d[ 0, :, :]
 
输出结果:
 
array([[1., 1., 1., 1.],
 
[1., 1., 1., 1.]])
 
在OpenCV中,图像要么是值在0到1之间的32位浮点数组,要么是值在0到255之间的8位整数数组。因此,使用8位整数,通过指定NumPy的dtype属性并将数组中的所有1乘以255,我们还可以创建一个2×4像素、全为白色的RGB图像:
 
arr_uint_3d = np.ones(( 3, 2, 4), dtype=np.uint8) * 255
 
arr_uint_3d
 
输出结果:
 
array([[[255, 255, 255, 255],
 
[255, 255, 255, 255]],
 
[[255, 255, 255, 255],
 
[255, 255, 255, 255]],
 
[[255, 255, 255, 255],
 
[255, 255, 255, 255]]], dtype=uint8)
 
关于作者:阿迪蒂亚·夏尔马(Aditya Sharma),罗伯特·博世(Robert Bosch)公司的一名高级工程师,致力于解决真实世界的自动计算机视觉问题。曾获得罗伯特·博世公司2019年人工智能编程马拉松的首名。
 
维什韦什·拉维·什里马利(Vishwesh Ravi Shrimali),于2018年毕业于彼拉尼博拉理工学院(BITS Pilani)机械工程专业。此后一直在BigVision LLC从事深度学习和计算机视觉方面的工作,还参与了官方OpenCV课程的创建。
 
迈克尔·贝耶勒(Michael Beyeler),是华盛顿大学神经工程和数据科学的博士后研究员,致力于仿生视觉的计算模型研究,以为盲人植入人工视网膜(仿生眼睛),改善盲人的感知体验。他的工作属于神经科学、计算机工程、计算机视觉和机器学习的交叉领域。

标签: Python NumPy
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告