内容简介:【Python】NumPy快餐教程(2) - 多维数组进阶
NumPy快餐教程(2) - 多维数组进阶
上一讲我们介绍了ndarray的形状变化和生成方法,这一节我们继续讨论多维数组的使用方法。
访问元素
NumPy中使用[]方括号来访问元素。如果是一维数组,就用下标数字,例如a[1],如果是多维数组,就在方括号中使用元组tuple,例如a[(2,3,4)]
例:
In [1]: import numpy as np In [2]: a20 = np.linspace(1,100,27) In [3]: a20 Out[3]: array([ 1. , 4.80769231, 8.61538462, 12.42307692, 16.23076923, 20.03846154, 23.84615385, 27.65384615, 31.46153846, 35.26923077, 39.07692308, 42.88461538, 46.69230769, 50.5 , 54.30769231, 58.11538462, 61.92307692, 65.73076923, 69.53846154, 73.34615385, 77.15384615, 80.96153846, 84.76923077, 88.57692308, 92.38461538, 96.19230769, 100. ]) In [4]: a21 = a20.reshape(3,3,3) In [5]: a21 Out[5]: array([[[ 1. , 4.80769231, 8.61538462], [ 12.42307692, 16.23076923, 20.03846154], [ 23.84615385, 27.65384615, 31.46153846]], [[ 35.26923077, 39.07692308, 42.88461538], [ 46.69230769, 50.5 , 54.30769231], [ 58.11538462, 61.92307692, 65.73076923]], [[ 69.53846154, 73.34615385, 77.15384615], [ 80.96153846, 84.76923077, 88.57692308], [ 92.38461538, 96.19230769, 100. ]]]) In [6]: print(a21[(1,1,1)]) 50.5
切片
用一个值采用方括号下标方式引用,而如果想要引用多个值的话,可以考虑做一个切片。比如s[1:3]就是由s[1]和s[2]组成的列表:
例:
In [10]: a22 = np.linspace(1,10,5) In [11]: a22 Out[11]: array([ 1. , 3.25, 5.5 , 7.75, 10. ]) In [12]: print(a22[2:4]) [ 5.5 7.75]
多维的切片也是同理,比如我们从一个3x3x3的立方体中切出一个2x2x2的小立方体:
In [5]: a21 Out[5]: array([[[ 1. , 4.80769231, 8.61538462], [ 12.42307692, 16.23076923, 20.03846154], [ 23.84615385, 27.65384615, 31.46153846]], [[ 35.26923077, 39.07692308, 42.88461538], [ 46.69230769, 50.5 , 54.30769231], [ 58.11538462, 61.92307692, 65.73076923]], [[ 69.53846154, 73.34615385, 77.15384615], [ 80.96153846, 84.76923077, 88.57692308], [ 92.38461538, 96.19230769, 100. ]]]) In [8]: slice1 = a21[1:3,1:3,1:3] In [9]: slice1 Out[9]: array([[[ 50.5 , 54.30769231], [ 61.92307692, 65.73076923]], [[ 84.76923077, 88.57692308], [ 96.19230769, 100. ]]])
请注意,切片的语法不用元组,直接在方括号里切就好了。
另外,切片可以使用负数做下标,-1就是右数第一个元素。最左和最右都可以不写,比如从1到最右,可以写成a[1:]
例:
In [11]: a22 Out[11]: array([ 1. , 3.25, 5.5 , 7.75, 10. ]) In [12]: print(a22[2:4]) [ 5.5 7.75] In [13]: a22[1:] Out[13]: array([ 3.25, 5.5 , 7.75, 10. ]) In [14]: a22[1:-1] Out[14]: array([ 3.25, 5.5 , 7.75])
多维数组的数据类型
在前面的学习中,我们并不在意数据类型,一样也可以使用多维数组。但是,有了类型之后,数组可以更方便和更快速的操作。
我们前面所学习的生成数组的方法,其实都可以默认带一个dtype参数。
类型值常用的有int32, int64, uint32, uint64, float32, float64, complex64, complex128等。因为NumPy是个数学库,精确的类型对于提高计算速度是很有益的。
例:
In [18]: a23 = np.logspace(1,10,5,base=2,dtype=np.float64) In [19]: a23 Out[19]: array([ 2. , 9.51365692, 45.254834 , 215.2694823 , 1024. ])
对数组的每个元素都进行计算
数据只有可以计算才有价值。我们学会了生成数组,访问数组,下一步就是如何对数组进行计算。
NumPy提供了大量的针对数组进行运算的函数,比如X是一个数组,np.sin(X)可以对数组中每一个元素都进行sin运算。
例:
In [20]: a24 = np.linspace(0, np.pi/2, 10, dtype=np.float64) In [21]: a24 Out[21]: array([ 0. , 0.17453293, 0.34906585, 0.52359878, 0.6981317 , 0.87266463, 1.04719755, 1.22173048, 1.3962634 , 1.57079633]) In [22]: a25 = np.sin(a24) In [23]: a25 Out[23]: array([ 0. , 0.17364818, 0.34202014, 0.5 , 0.64278761, 0.76604444, 0.8660254 , 0.93969262, 0.98480775, 1. ])
这是一行的,多行的也照样管用,我们看个例子:
In [24]: a26 = np.linspace(0, np.pi*2, 16, dtype=np.float32) In [25]: a26 Out[25]: array([ 0. , 0.41887903, 0.83775806, 1.2566371 , 1.67551613, 2.09439516, 2.51327419, 2.93215322, 3.35103226, 3.76991129, 4.18879032, 4.60766935, 5.02654839, 5.44542742, 5.86430645, 6.28318548], dtype=float32) In [27]: a27 = np.sin(a26.reshape(4,4)) In [28]: a27 Out[28]: array([[ 0.00000000e+00, 4.06736642e-01, 7.43144870e-01, 9.51056540e-01], [ 9.94521916e-01, 8.66025388e-01, 5.87785184e-01, 2.07911611e-01], [ -2.07911789e-01, -5.87785363e-01, -8.66025448e-01, -9.94521916e-01], [ -9.51056480e-01, -7.43144751e-01, -4.06736493e-01, 1.74845553e-07]], dtype=float32)
数组之间支持加减乘除,乘方,取余。
例:给一个数组的每个元素都乘以2
In [31]: a28 = np.array([1,2,3,4]).reshape(2,-1) In [32]: a28 Out[32]: array([[1, 2], [3, 4]]) In [33]: a28*2 Out[33]: array([[2, 4], [6, 8]])
两个数组之间做加法:
In [35]: a29 = np.ones((2,2)) In [36]: a29 Out[36]: array([[ 1., 1.], [ 1., 1.]]) In [37]: a28+a29 Out[37]: array([[ 2., 3.], [ 4., 5.]])
不但算术运算可以做,也可以针对整个数组做比较大小运算。
例:
In [38]: a29>a28 Out[38]: array([[False, False], [False, False]], dtype=bool)
汇总类的运算
除了对每个元素进行计算,我们还可以对这些元素进行汇总,比如求和sum,求平均值mean等。
例:
In [40]: np.sum(a28) Out[40]: 10 In [41]: np.mean(a28) Out[41]: 2.5
矩阵matrix
除了前面所讲的多维数组,NumPy还提供了矩阵类matrix. matrix的默认运算都是矩阵运算。
例:
In [45]: a30 = np.matrix(np.linspace(1,10,9,dtype=np.float64).reshape(3,-1)) In [46]: a30 Out[46]: matrix([[ 1. , 2.125, 3.25 ], [ 4.375, 5.5 , 6.625], [ 7.75 , 8.875, 10. ]]) In [48]: a31 = np.matrix(np.ones((3,3))) In [49]: a31 Out[49]: matrix([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]) In [50]: np.dot(a30,a31) Out[50]: matrix([[ 6.375, 6.375, 6.375], [ 16.5 , 16.5 , 16.5 ], [ 26.625, 26.625, 26.625]])
矩阵的逆阵,就可以直接用X**-1来表示。
例:
In [52]: a30 ** -1 Out[52]: matrix([[ 9.38565300e+14, -1.87713060e+15, 9.38565300e+14], [ -1.87713060e+15, 3.75426120e+15, -1.87713060e+15], [ 9.38565300e+14, -1.87713060e+15, 9.38565300e+14]]) In [53]: a30 Out[53]: matrix([[ 1. , 2.125, 3.25 ], [ 4.375, 5.5 , 6.625], [ 7.75 , 8.875, 10. ]]) In [54]: a30 * (a30 ** -1) Out[54]: matrix([[ 0.8125 , -0.125 , 0. ], [ 0.15625, -1.0625 , 1. ], [ 0. , 0. , 2. ]])
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Javaer 运维指令合集(快餐版)
- C语言指针数组和数组指针
- 数组 – 如何在Swift中将数组拆分成两半?
- 菜鸡的算法修炼:数组(旋转数组的最小数字)
- 交换数组元素,使得数组的和的差最小
- JS数组专题1️⃣ ➖ 数组扁平化
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
工程问题C++语言求解
Delores M.Etter、Jeanine A.Ingber / 冯力、周凯 / 机械工业出版社 / 2014-8 / 79元
本书介绍了如何利用ANSIC++编程语言以基于对象的编程方式来解决工程问题。书中引用了大量来自于不同工程、科学和计算机科学领域的示例,是一本理论和实践结合紧密的教材。针对C++基本语法的各个部分,由浅入深地进行讲解。每讲解一部分基础知识,同时会结合多个相关实例,实例内容详实,紧贴所讲内容,使读者能够立刻对所学知识进行练习,实战性强。一起来看看 《工程问题C++语言求解》 这本书的介绍吧!