首先我们要知道为什么要使用numpy。
python是一门高级汇编语言,标准的Python中用列表(list)保存一组值,可以当作数组使用。但由于列表的元素可以是任何对象,因此列表中保存的是对象的指针。对于数值运算来说,这种结构显然比较浪费内存和CPU计算。
为了节省计算时间和节省内存空间,我们可以使用Numpy来弥补其中不足。
(小技巧:键盘Home键可以让光标移动到本行最左,而End键可以让光标移动到末尾,先用Home将光标移动到左侧,再按住Shift+End即可圈选本行)
import numpy as np
>>> a = np.array([1, 2, 3, 4])
>>> b = np.array((5, 6, 7, 8))
>>> c = np.array([[1, 2, 3, 4],[4, 5, 6, 7], [7, 8, 9, 10]])
>>> b
array([5, 6, 7, 8])
>>> c
array([[1, 2, 3, 4], [4, 5, 6, 7], [7, 8, 9, 10]])
>>> c.dtype #数组的元素类型可以通过dtype 属性获得 dtype('int32')
>>> a.shape #一维数组 (4L,)
>>> c.shape #二维数组其中第0 轴的长度为3,第1 轴的长度为4
(3L, 4L)
>>> c.shape = 4,3
>>> c
array([[ 1, 2, 3], [ 4, 4, 5], [ 6, 7, 7], [ 8, 9, 10]])
#注意从(3,4)改为(4,3)并不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变:
>>> c.shape = 2,-1
>>> c
array([[ 1, 2, 3, 4, 4, 5],
[ 6, 7, 7, 8, 9, 10]])
#当某个轴的元素为-1时,将根据数组元素的个数自动计算此轴的长度,因此下面的程序将数组c的 shape改为了(2,6)。
>>> d = a.reshape((2,2))
>>> d array([[1, 2],
[3, 4]])
>>>> a array([1, 2, 3, 4])
#使用数组的reshape方法,可以创建一个改变了尺寸的新数组,原数组的shape保持不变。
类似于python的range函数,通过指定开始值、终值和步长来创建一维数组,注意数组不包括终值:
>>> np.arange(0,1,0.1)
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
通过指定开始值、终值和元素个数来创建一维数组,可以通过endpoint关键字指定是否包括终值,缺省设置是包括终值:
>>> np.linspace(0, 1, 10) # 步长为1/9
array([ 0. , 0.11111111, 0.22222222, 0.33333333, 0.44444444,0.55555556, 0.66666667, 0.77777778, 0.88888889, 1. ])
>>> np.linspace(0, 1, 10, endpoint=False) # 步长为1/10
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
和linspace类似,不过它创建等比数列,下面的例子产生1(100)到100(102)、有20个元素的等比数列:
>>> np.logspace(0, 2, 20)
array([ 1. , 1.27427499, 1.62377674, 2.06913808,
2.6366509 , 3.35981829, 4.2813324 , 5.45559478,
6.95192796, 8.8586679 , 11.28837892, 14.38449888,
18.32980711, 23.35721469, 29.76351442, 37.92690191,
48.32930239, 61.58482111, 78.47599704, 100. ])
创建指定形状和类型的数组。
>>> np.empty((2,3),np.int) #只分配内存,不对其进行初始化
array([[ 32571594, 32635312, 505219724],
[ 45001384, 1852386928, 665972]])
>>> np.zeros(4, np.float) #元素类型默认为np.float,因此这里可以省略
array([ 0., 0., 0., 0.])
>>> def func(i):
return i%4+1
>>> np.fromfunction(func, (10,))
array([ 1., 2., 3., 4., 1., 2., 3., 4., 1., 2.])
fromfunction函数的第一个参数为计算每个数组元素的函数,第二个参数为数组的大小(shape)。
>>> def func2(i, j):
return (i+1) * ( j+1)
>>> a = np.fromfunction(func2, (9,9))
>>> a
array([[ 1., 2., 3., 4., 5., 6., 7., 8., 9.],
[ 2., 4., 6., 8., 10., 12., 14., 16., 18.],
[ 3., 6., 9., 12., 15., 18., 21., 24., 27.],
[ 4., 8., 12., 16., 20., 24., 28., 32., 36.],
[ 5., 10., 15., 20., 25., 30., 35., 40., 45.],
[ 6., 12., 18., 24., 30., 36., 42., 48., 54.],
[ 7., 14., 21., 28., 35., 42., 49., 56., 63.],
[ 8., 16., 24., 32., 40., 48., 56., 64., 72.],
[ 9., 18., 27., 36., 45., 54., 63., 72., 81.]])
矩阵形式(主要是以坐标i,j为自变量函数比较方便)
创建n个0-1的随机数数组
>>>x=np.random.rand(10)
>>>x
array([0.97520257, 0.68184737, 0.61750545, 0.14097668, 0.72720486,
0.65235402, 0.38819762, 0.51943454, 0.38636835, 0.37297904])
使数组每个元素和0.5进行比较,分到一个布尔数组(True/False)
>>> x>0.5
array([ True, True, True, False, True, True, False, True, False,
False])
通过reshape行数可以形成列向量
通过列向量与行向量相加可以直接获得两向量行列分别相加得到的矩阵
>>>np.arange(0, 60, 10).reshape(-1, 1) + np.arange(0, 6)
array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])