您的位置:首页 > 编程语言 > Python开发

python之Numpy使用

2015-10-03 22:03 766 查看
Numpy是高性能计算和数据分析的基础包:它的功能如下:

1)、ndarray:一个具有矢量运算和复杂广播能力的快速且节省空间的多维数组。

2)、用于对整组数据进行标准运算的数学函数

3)、用于读写磁盘数据的工具以及用于操作内存映射文件的工具

4)、线性代数、随机数生成以及傅里叶变换功能

5)、用于集成C/C++等语言编写代码的工具

一、基础篇

1、ndarray:一种多维数组对象

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

包含实际数组元素的缓冲区,通常我们不需要使用这个属性,因为我们总是通过索引来使用数组中的元素。

创建ndarray
>>> import numpy as np
>>> data = [6,7,5,8,0,1]
>>> arr = np.array(data)
>>> arr
array([6, 7, 5, 8, 0, 1])
>>>


>>> data2=[[1,2,3,4],[5,6,7,8]]
>>> arr2=np.array(data2)
>>> arr2
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
>>>
>>> arr.ndim
1
>>> arr2.ndim
2
>>> arr.shape
(6,)
>>> arr2.shape
(2, 4)
>>> arr.dtype
dtype('int64')
>>> arr2.dtype
dtype('int64')
>>>


>>> np.zeros(10)
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
>>> np.zeros((3,6))
array([[ 0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.]])
>>> np.ones(5)
array([ 1.,  1.,  1.,  1.,  1.])
>>> np.empty(2,3,2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: data type not understood
>>> np.empty((2,3,2))
array([[[  0.00000000e+000,   0.00000000e+000],
[  1.23516411e-322,   0.00000000e+000],
[  7.30242818e-304,   0.00000000e+000]],

[[  0.00000000e+000,  -1.52916882e+113],
[  0.00000000e+000,   0.00000000e+000],
[  1.12541323e-111,   0.00000000e+000]]])
>>>


zeros和ones分别可以创建指定长度或形状的全0全1数组,empty则返回没有具体值的数组。
数组创建函数



>>> np.arange(15)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])
ndarray的数据类型





>>> import numpy as np
>>> np.arange(15) array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> arr = np.array([1,2,3],dtype=np.float64)
>>> arr.dtype
dtype('float64')
>>> int_arr=arr.astype(np.int64)
>>> int_arr
array([1, 2, 3])
>>> int_arr.dtype
dtype('int64')
>>> numeric_strings =np.array(['1.25','-9.6','42'],dtype.string_)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'dtype' is not defined
>>> numeric_strings =np.array(['1.25','-9.6','42'],dtype = np.string_)
>>> numeric_strings
array([b'1.25', b'-9.6', b'42'],
dtype='|S4')
>>> numeric_strings.dtype
dtype('S4')
>>> numeric_strings.astype(float)
array([ 1.25, -9.6 , 42. ])
>>> numeric_strings.dtype
dtype('S4')


数组和标量之间的运算
>>> arr = np.array([[1,2,3],[4,5,6]])
>>> arr
array([[1, 2, 3],
[4, 5, 6]])
>>> arr * arr
array([[ 1,  4,  9],
[16, 25, 36]])
>>> 1 / arr
array([[ 1.        ,  0.5       ,  0.33333333],
[ 0.25      ,  0.2       ,  0.16666667]])
>>> arr **0.5
array([[ 1.        ,  1.41421356,  1.73205081],
[ 2.        ,  2.23606798,  2.44948974]])


基本的索引和切片
>>> arr = np.arange(10)
>>> arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> arr[5]
5
>>> arr[5:8]
array([5, 6, 7])
>>> arr[5:8] = 10
>>> arr
array([ 0,  1,  2,  3,  4, 10, 10, 10,  8,  9])
多维数组
>>> arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> arr2d[2]
array([7, 8, 9])
>>> arr2d[0][2]
3
>>> arr2d[0] =10
>>> arr2d
array([[10, 10, 10],
[ 4,  5,  6],
[ 7,  8,  9]])


切片索引
ndarry的切片语法和python的列表类似

>>> arr[1:6]
array([ 1,  2,  3,  4, 10])
>>> arr2d[:2]
array([[10, 10, 10],
[ 4,  5,  6]])
>>> arr2d[:2,1:]
array([[10, 10],
[ 5,  6]])

注意:只有冒号表示选取整个轴

>>> arr2d[:,:1]
array([[10],
[ 4],
[ 7]])
布尔型索引

>>> names = np.array(['Bob','Joe','Will','Boe','Bill','Joe'])
>>> data = np.random.randn(7,4)
>>> data
array([[ 0.79695103,  0.0299971 , -0.59623186, -0.24272421],
[-1.69125924, -0.67068454, -0.31525311, -1.72922377],
[-1.29614427, -0.51628036, -0.1137131 , -0.88153765],
[-0.47269362, -0.20382923,  0.10858334,  0.54570916],
[-0.71040368, -1.41826188, -1.17867401,  1.07643113],
[ 1.00396752,  0.46841433,  0.58578778,  0.6859775 ],
[ 0.53684137, -0.2065546 , -1.29747978,  0.03839398]])
>>> names
array(['Bob', 'Joe', 'Will', 'Boe', 'Bill', 'Joe'],
dtype='<U4')
>>>
假设每个名字都对应data数组中得一行,而我们想选出对应名字“Bob”的所有行

>>> names=='Bob'
True
>>> names = np.array(['Bob','Joe','Will','Boe','Bill','Joe'])
>>> names=='Bob'
array([ True, False, False, False, False, False], dtype=bool)
>>> data[names=='Bob']
array([[ 0.79695103,  0.0299971 , -0.59623186, -0.24272421]])
>>> data[names=='Bob',2:]
array([[-0.59623186, -0.24272421]])
>>> names != 'Bob'
array([False,  True,  True,  True,  True,  True], dtype=bool)>> mask=(names=='Bob')|(names=='Will')
>>> mask
array([ True, False,  True, False, False, False], dtype=bool)
>>>


花式索引
是numpy的术语,指的是利用整数数组进行索引

>>> arr = np.empty((8,4))>>> for i in range(8):
...     arr[i]=i
...
>>> arr
array([[ 0.,  0.,  0.,  0.],
[ 1.,  1.,  1.,  1.],
[ 2.,  2.,  2.,  2.],
[ 3.,  3.,  3.,  3.],
[ 4.,  4.,  4.,  4.],
[ 5.,  5.,  5.,  5.],
[ 6.,  6.,  6.,  6.],
[ 7.,  7.,  7.,  7.]])
>>>


选取子行:

>>> arr = np.empty((8,4))
>>> for i in range(8):
...     arr[i]=i
...
>>>
>>> arr
array([[ 0.,  0.,  0.,  0.],
[ 1.,  1.,  1.,  1.],
[ 2.,  2.,  2.,  2.],
[ 3.,  3.,  3.,  3.],
[ 4.,  4.,  4.,  4.],
[ 5.,  5.,  5.,  5.],
[ 6.,  6.,  6.,  6.],
[ 7.,  7.,  7.,  7.]])
>>> arr[[4,3,0,6]]
array([[ 4.,  4.,  4.,  4.],
[ 3.,  3.,  3.,  3.],
[ 0.,  0.,  0.,  0.],
[ 6.,  6.,  6.,  6.]])
>>> arr[[-3,-5,-7]]
array([[ 5.,  5.,  5.,  5.],
[ 3.,  3.,  3.,  3.],
[ 1.,  1.,  1.,  1.]])
>>> arr=np.arange(32).reshape((8,4))
>>> arr
array([[ 0,  1,  2,  3],
[ 4,  5,  6,  7],
[ 8,  9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31]])
>>> arr[[1,5,7,2],[0,3,1,2]]
array([ 4, 23, 29, 10])
>>>


数组转置和轴对换

>>> arr
array([[ 0,  1,  2,  3],
[ 4,  5,  6,  7],
[ 8,  9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31]])
>>> arr.T
array([[ 0,  4,  8, 12, 16, 20, 24, 28],
[ 1,  5,  9, 13, 17, 21, 25, 29],
[ 2,  6, 10, 14, 18, 22, 26, 30],
[ 3,  7, 11, 15, 19, 23, 27, 31]])
>>>
利用np.dot计算矩阵内积XtX:

>>> arr =np.random.randn(6,3)
>>> arr
array([[ 2.06975813, -0.85796742,  0.19999776],
[-0.01597614,  1.72374268,  0.16050437],
[ 2.07838301,  1.04537751,  0.69326084],
[-1.4849106 , -0.38374416,  0.73700956],
[-0.31204997,  0.368051  ,  0.05084386],
[-0.63419748, -0.90331828,  2.53133718]])
>>> np.dot(arr.T,arr)
array([[ 11.30837101,   1.3972287 ,  -0.86338249],
[  1.3972287 ,   5.89891606,  -1.72091715],
[ -0.86338249,  -1.72091715,   7.49980746]])
>>>
对于高维数组,transpose需要轴编号才能转置

2、通用函数:快速的元素级数组函数

ufunc是universal function的缩写,它是一种能对数组的每个元素进行操作的函数。NumPy内置的许多ufunc函数都是在C语言级别实现的,因此它们的计算速度非常快。





>>> points=np.arange(-5,5,0.01) #1000个间隔点
>>> xs,ys=np.meshgrid(points,points)
>>> xs
array([[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
...,
[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99],
[-5.  , -4.99, -4.98, ...,  4.97,  4.98,  4.99]])
>>> z = np.sqrt(xs**2+ys**2)
>>> z
array([[ 7.07106781,  7.06400028,  7.05693985, ...,  7.04988652,
7.05693985,  7.06400028],
[ 7.06400028,  7.05692568,  7.04985815, ...,  7.04279774,
7.04985815,  7.05692568],
[ 7.05693985,  7.04985815,  7.04278354, ...,  7.03571603,
7.04278354,  7.04985815],
...,
[ 7.04988652,  7.04279774,  7.03571603, ...,  7.0286414 ,
7.03571603,  7.04279774],
[ 7.05693985,  7.04985815,  7.04278354, ...,  7.03571603,
7.04278354,  7.04985815],
[ 7.06400028,  7.05692568,  7.04985815, ...,  7.04279774,
7.04985815,  7.05692568]])
>>> plt.imshow(z,cmap=plt.cm.gray);plt.colorbar()
<matplotlib.image.AxesImage object at 0x10789e390>
<matplotlib.colorbar.Colorbar object at 0x1078b2e10>
>>> plt.title("Image plot of $\sqrt{x^2+y^2}$ for a grid of values")
<matplotlib.text.Text object at 0x10787a518>



将条件逻辑表达式表述为数组运算

numpy.where是三元表达式 x if condition else y的矢量化版本

>>> xarr=np.array([1.1,1.2,1.3,1.4,1.5])
>>> yarr=np.array([2.1,2.2,2.3,2.4,2.5])
>>> cond=np.array([True,False,True,True,False])
>>> result=np.where(cond,xarr,yarr)
>>> result
array([ 1.1,  2.2,  1.3,  1.4,  2.5])
>>>


数学和统计方法

>>> import numpy as np
>>> arr = np.random.randn(5,4)
>>> arr.mean()
-0.22696057024253907
>>> arr.sum()
-4.5392114048507812
>>> arr
array([[-0.70841945, -0.05771976,  0.56725563, -0.12069791],
[ 1.97462838,  0.94100408, -0.44880957, -1.33849321],
[-2.85873   ,  0.19188458,  0.43721548,  1.46197352],
[ 0.87946223, -1.49055119,  0.35200715,  1.5240487 ],
[-1.34499714, -1.77287332, -1.85514668, -0.87225292]])

http://reverland.org/python/2012/08/22/numpy/#section-6 二、通用函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: