NumPy的主要对象是同种元素的多维数组。
1.创建数组
可以使用 array函数从常规的Python列表和元组创造数组。所创建的数组类型由原序列中的元素类型推导而来。
用一组来[]内的书来创造数组,后面可以加上数据类型
>>> from numpy import *
>>> a = array( [2,3,4],dtype=numpy.int32)
<span>>>> a </span>
<span> array([<span class="number">2</span><span>, </span><span class="number">3</span><span>, </span><span class="number">4</span><span>]) </span></span><span> </span>
>>> b = array([1.2, 3.5, 5.1],'float64')
<pre class="python" name="code"><span>>>> b </span>
<span> array([1.<span class="number">2</span><span>, </span><span class="number">3.5</span><span>, </span><span class="number">5.1</span><span>]) </span></span><span></span>
类似可以构造二维数组,三维数组,例如:
>>> a = array( [ (1,2,3), (4,5,6) ] )
>>> a
array([[ 1 , 2 , 3 ],
[ 4 , 5 , 6 ]])
同样,可用函数zeros可创建一个全是0的数组,用函数ones可创建一个全为1的数组,函数empty创建一个内容随机并且依赖与内存状态的数组。默认创建的数组类型(dtype)都是float64。如:
>>> d = zeros((3,4))
>>> d
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
还可用arange函数返回一个数列形式的数组arange(初始点,终点,步长)如:
>>> arange(10, 30, 5)
array([10, 15, 20, 25])
如对于浮点数可以用linspace函数代替arange函数,如:
>>> linspace(-1, 0, 5)
array([-1, -0.75,-0.5 ,-0.25, 0 ])
resharp(num1,num2)函数将一维数组分解成包含 num1 个一维数组的二维数组 ,每个部分包含 num2 个元素如:
>>> print np.arange(15).reshape(3,5)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
2.输出数组
当输出一个数组时,NumPy以特定的布局用类似嵌套列表的形式显示:
- 第一行从左到右输出
- 每行依次自上而下输出
- 每个切片通过一个空行与下一个隔开
- 一维数组被打印成行,二维数组成矩阵,三维数组成矩阵列表。
>>> a = arange(6)
>>> print a
[0 1 2 3 4 5]
>>> b = arange(12).reshape(4,3)
>>> print b
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
>>> c = arange(24).reshape(2,3,4)
>>> 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]]]
如果一个数组太长,则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]]
3.索引,切片和迭代
>>> a=array [[1,2,3],[4,5,6]]
>>> a[1][2]
6
>>>a[1,2]
6
>>>a[1]
array ([4,5,6])
>>>a[1,1:2]
5
多维数组的遍历是以是第一个轴为基础的:
>>>for row in a:
print row
[1,2,3]
[4,5,6]
4.基本运算
数组的算术运算是按元素逐个运算。数组运算后将创建包含运算结果的新数组。乘法运算符*按元素逐个计算,矩阵乘法可以使用dot函数:
>>> a= np.array([20,30,40,50])
>>> b= np.arange( 4)
>>> b
array([0, 1, 2, 3])
>>> c= a-b
>>> c
array([20, 29, 38, 47])
>>> b**2
array([0, 1, 4, 9])
>>> A= np.array([[1,1], [0,1]])
>>> B= np.array([[2,0], [3,4]])
>>> A*B
array([[2, 0],
[0, 4]])
>>> np.dot(A,B)
array([[5, 4],
[3, 4]])
5.数组组合
>>> a = arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> b = 2 * a
>>> b
array([[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]])
水平组合
>>> hstack((a, b))
array([[ 0, 1, 2, 0, 2, 4],
[ 3, 4, 5, 6, 8, 10],
[ 6, 7, 8, 12, 14, 16]])
垂直组合
>>> vstack((a, b))
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16]])
深度组合
>>> dstack((a, b))
array([[[ 0, 0],
[ 1, 2],
[ 2, 4]],
[[ 3, 6],
[ 4, 8],
[ 5, 10]],
[[ 6, 12],
[ 7, 14],
[ 8, 16]]])
6.数组复制
完全不复制
>>> a = arange(12)
>>> b = a
>>> b is a
True
浅复制
>>> c = a.view()
>>> c is a
False
>>> c[0,4] = 1234
>>> a
array([[ 0, 1, 2, 3],
[1234, 5, 6, 7],
[ 8, 9, 10, 11]])
深复制
>>> d = a.copy()
>>> d is a
False
>>> d.base is a
False
>>> d[0,0] = 9999
>>> a
array([[ 0, 10, 10, 3],
[1234, 10, 10, 7],
[ 8, 10, 10, 11]])