numpy官⽹详细教程(中⽂版)
先决条件
在阅读这个教程之前,你多少需要知道点。如果你想从新回忆下,请看看.
如果你想要运⾏教程中的⽰例,你⾄少需要在你的电脑上安装了以下⼀些软件:
这些是可能对你有帮助的:
是⼀个净强化的交互Python Shell,对探索NumPy的特性⾮常⽅便。
将允许你绘图
在NumPy的基础上提供了很多科学模块
基础篇
NumPy的主要对象是同种元素的多维数组。这是⼀个所有的元素都是⼀种类型、通过⼀个正整数元组索引的元素表格(通常是元素是数字)。在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。
例如,在3D空间⼀个点的坐标[1, 2, 3]是⼀个秩为1的数组,因为它只有⼀个轴。那个轴长度为3.⼜例如,在以下例⼦中,数组的秩为2(它有两个维度).第⼀个维度长度为2,第⼆个维度长度为3.
[[ 1., 0., 0.],
[ 0., 1., 2.]]
NumPy的数组类被称作ndarray。通常被称作数组。注意numpy.array和标准Python库类array.array并不相同,后者只处理⼀维数组和提供少量功能。更多重要ndarray对象属性有:
ndarray.ndim
数组轴的个数,在python的世界中,轴的个数被称作秩
ndarray.shape
数组的维度。这是⼀个指⽰数组在每个维度上⼤⼩的整数元组。例如⼀个n排m列的矩阵,它的shape属性将是(2,3),这个元组的长度显然是秩,即维度或者ndim属性
ndarray.size
数组元素的总个数,等于shape属性中元组元素的乘积。
ndarray.dtype
⼀个⽤来描述数组中元素类型的对象,可以通过创造或指定dtype使⽤标准Python类型。另外NumPy提供它⾃⼰的数据类型。
ndarray.itemsize
数组中每个元素的字节⼤⼩。例如,⼀个元素类型为float64的数组itemsiz属性值为8(=64/8),⼜如,⼀个元素类型为complex32的数组item属性为4(=32/8).
ndarray.data
包含实际数组元素的缓冲区,通常我们不需要使⽤这个属性,因为我们总是通过索引来使⽤数组中的元素。
⼀个例⼦
>>> from numpy import *
>>> a = arange(15).reshape(3, 5)
>>> a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
>>> a.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype.name
'int32'
>>> a.itemsize
4
>>> a.size
15
>>> type(a)
numpy.ndarray
>>> b = array([6, 7, 8])
>>> b
array([6, 7, 8])
exploit和explore的区别>>> type(b)
numpy.ndarray
创建数组
有好⼏种创建数组的⽅法。
例如,你可以使⽤array函数从常规的Python列表和元组创造数组。所创建的数组类型由原序列中的元素类型推导⽽来。
>>> from numpy import *
>>> a = array( [2,3,4] )
>>> a
array([2, 3, 4])
>>> a.dtype
dtype('int32')
>>> b = array([1.2, 3.5, 5.1])
>>> b.dtype
dtype('float64') ⼀个常见的错误包括⽤多个数值参数调⽤`array`⽽不是提供⼀个由数值组成的列表作为⼀个参数。
>>> a = array(1,2,3,4) # WRONG
>>> a = array([1,2,3,4]) # RIGHT
数组将序列包含序列转化成⼆维的数组,序列包含序列包含序列转化成三维数组等等。
>>> b = array( [ (1.5,2,3), (4,5,6) ] )产生随机数的条件
>>> b
array([[ 1.5, 2. , 3. ],
[ 4. , 5. , 6. ]])电脑python安装教程
数组类型可以在创建时显⽰指定
>>> c = array( [ [1,2], [3,4] ], dtype=complex )
>>> c
array([[ 1.+0.j, 2.+0.j],
[ 3.+0.j, 4.+0.j]])
通常,数组的元素开始都是未知的,但是它的⼤⼩已知。因此,NumPy提供了⼀些使⽤占位符创建数组的函数。这最⼩化了扩展数组的需要和⾼昂的运算代价。
函数function创建⼀个全是0的数组,函数ones创建⼀个全1的数组,函数empty创建⼀个内容随机并且依赖与内存状态的数组。默认创建的数组类型(dtype)都是float64。
>>> zeros( (3,4) )
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
>>> ones( (2,3,4), dtype=int16 ) # dtype can also be specified
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]]], dtype=int16)
>>> empty( (2,3) )
array([[ 3.73603959e-262, 6.02658058e-154, 6.55490914e-260],
[ 5.30498948e-313, 3.14673309e-307, 1.00000000e+000]])
css边框实现为了创建⼀个数列,NumPy提供⼀个类似arange的函数返回数组⽽不是列表:
>>> arange( 10, 30, 5 )
array([10, 15, 20, 25])
>>> arange( 0, 2, 0.3 ) # it accepts float arguments
array([ 0. , 0.3, 0.6, 0.9, 1.2, 1.5, 1.8])
当arange使⽤浮点数参数时,由于有限的浮点数精度,通常⽆法预测获得的元素个数。因此,最好使⽤函数linspace去接收我们想要的元素个数来代替⽤range来指定步长。
其它函数array, zeros, zeros_like, ones, ones_like, empty, empty_like, arange, linspace, rand, randn, fromfunction, fromfile参考:
打印数组
当你打印⼀个数组,NumPy以类似嵌套列表的形式显⽰它,但是呈以下布局:
最后的轴从左到右打印
次后的轴从顶向下打印
剩下的轴从顶向下打印,每个切⽚通过⼀个空⾏与下⼀个隔开
⼀维数组被打印成⾏,⼆维数组成矩阵,三维数组成矩阵列表。
>>> a = arange(6) # 1d array
>>> print a
[0 1 2 3 4 5]
>>>
>>> b = arange(12).reshape(4,3) # 2d array
>>> print b
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
>>>
>>> c = arange(24).reshape(2,3,4) # 3d array
>>> print c
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
查看形状操作⼀节获得有关reshape的更多细节
如果⼀个数组⽤来打印太⼤了,NumPy⾃动省略中间部分⽽只打印⾓落
>>> print arange(10000)
[ 0 1 2 ..., 9997 9998 9999]
>>>
>>> print arange(10000).reshape(100,100)
[[ 0 1 2 ..., 97 98 99]
[ 100 101 102 ..., 197 198 199]
[ 200 201 202 ..., 297 298 299]
...,
[9700 9701 9702 ..., 9797 9798 9799]
[9800 9801 9802 ..., 9897 9898 9899]
[9900 9901 9902 ..., 9997 9998 9999]]
禁⽤NumPy的这种⾏为并强制打印整个数组,你可以设置printoptions参数来更改打印选项。
>>> set_printoptions(threshold='nan')
基本运算
数组的算术运算是按元素的。新的数组被创建并且被结果填充。
>>> a = array( [20,30,40,50] )
>>> b = arange( 4 )
>>> b
array([0, 1, 2, 3])
>>> c = a-b
>>> c
array([20, 29, 38, 47])
>>> b**2
array([0, 1, 4, 9])
>>> 10*sin(a)
array([ 9.12945251, -9.88031624, 7.4511316 , -2.62374854])
>>> a<35
array([True, True, False, False], dtype=bool)
不像许多矩阵语⾔,NumPy中的乘法运算符*指⽰按元素计算,矩阵乘法可以使⽤dot函数或创建矩阵对象实现(参见教程中的矩阵章节)
>>> A = array( [[1,1],
... [0,1]] )
java中什么是面向对象>>> B = array( [[2,0],
... [3,4]] )
>>> A*B # elementwise product
array([[2, 0],
[0, 4]])
>>> dot(A,B) # matrix product
array([[5, 4],
[3, 4]])
有些操作符像+=和*=被⽤来更改已存在数组⽽不创建⼀个新的数组。
>>> a = ones((2,3), dtype=int)
>>> b = random.random((2,3))
>>> a *= 3
>>> a
array([[3, 3, 3],
[3, 3, 3]])
>>> b += a
>>> b
array([[ 3.69092703, 3.8324276 , 3.0114541 ],
[ 3.18679111, 3.3039349 , 3.37600289]])
>>> a += b # b is converted to integer type
>>> a
array([[6, 6, 6],
[6, 6, 6]])
当运算的是不同类型的数组时,结果数组和更普遍和精确的已知(这种⾏为叫做upcast)。
>>> a = ones(3, dtype=int32)
>>> b = linspace(0,pi,3)
>>> b.dtype.name
'float64'
>>> c = a+b
>>> c
array([ 1. , 2.57079633, 4.14159265])
>>> c.dtype.name
'float64'
>>> d = exp(c*1j)
>>> d
array([ 0.54030231+0.84147098j, -0.84147098+0.54030231j,
-
0.54030231-0.84147098j])
>>> d.dtype.name
'complex128' 许多⾮数组运算,如计算数组所有元素之和,被作为ndarray类的⽅法实现
>>> a = random.random((2,3))
>>> a
array([[ 0.6903007 , 0.39168346, 0.16524769],
[ 0.48819875, 0.77188505, 0.94792155]])settimeout第二个参数
>>> a.sum()
3.4552372100521485
>>> a.min()
0.16524768654743593
>>> a.max()
0.9479215542670073
这些运算默认应⽤到数组好像它就是⼀个数字组成的列表,⽆关数组的形状。然⽽,指定axis参数你可以吧运算应⽤到数组指定的轴上:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论