整理:杨柳依
参考资料:《Numpy学习指南(第2版)》
1. numpy 数组
1.1 创建数组
以下省略
from numpy import *
-
创建一维数组
>>> a = arange(5) # 创建一维数组 >>> b = array([1,2,3,4,5]) # 创建一维数组 >>> c = array([1,2,3,4,5], dtype=int64) # 指定数据类型 >>> d = array([1,2,3.5]) # 传入的list必须是同一类型,否则会自动转换
-
创建多维数组
>>> a = array([[1,2,3],[4,5,6]]) # 创建二维数组 >>> a.shape # (2, 3) >>> a.ndim # 2 >>> a[1,0] # 4
-
获取数组属性
>>> a = arange(5) # array([0, 1, 2, 3, 4]) >>> a.dtype # 获取类型 dtype('int32') >>> a.shape # 获取形状,返回一个元祖,可以看出是一维数组 (5,) >>> a.ndim # 获取维度,返回一个数字 1 >>> a.size # 返回元素总个数 5 >>> a.itemsize # 返回数组单个元素所占字节数 4 >>> a.nbytes # 返回数组所占总空间 20 >> a.T # 转置,对于一维数组无变化
对于复数元素,有
>>> b = array([1+2j,2+4j]) # array([1.+2.j, 2.+4.j]) >>> b.real # 获取实部 array([1., 2.]) >>> b.imag # 获取虚部 array([2., 4.])
特别的,使用
flat
属性获取一个迭代器>>> a = array([[1,2,3],[4,5,6]]) >>> f = a.flat >>> for i in a.flat: print(i," ",type(i)) 1 <class 'numpy.int32'> 2 <class 'numpy.int32'> 3 <class 'numpy.int32'> 4 <class 'numpy.int32'> 5 <class 'numpy.int32'> 6 <class 'numpy.int32'> # 注意,使用一个for循环无法取到每一个元素,只能取出[1,2,3]和[4,5,6] >>> a.flat = 9 # 对flat属性赋值会覆盖所有元素 >>> a array([[9, 9, 9], [9, 9, 9]])
1.2 数组切片
-
一维数组切片
>>> a = arange(10) # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> a[3:7] array([3, 4, 5, 6]) >>> a[3:7:2] # 步长为2 array([3, 5]) >>> a[::-1] # 步长为-1,相当于翻转 array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
-
多维数组切片
>>> a = array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) >>> a[:,0] # 获取第1列,得到一维数组 array([1, 5, 9]) >>> a[0,:] # 获取第1行,得到一维数组 array([1, 2, 3, 4]) >>> b = array(([[[1,2,3], [4,5,6]], [[7,8,9], [10,11,12]]])) >>> b[0,:,:] # 获取第1张表上的所有数据 array([[1, 2, 3], [4, 5, 6]]) >>> b[0,...] # 同上,多个连续的冒号(:)可以用省略号(...)代替 >>> b[0] # 同上,后面的冒号可以直接省略 >>> b[0,:,-1] # 获取第1张表上所有行最后一列的数据 array([3, 6]) >>> b[0,:,::-1] # 将第1张表上所有行的列元素倒序排列 array([[3, 2, 1], [6, 5, 4]])
1.3 改变数组维度
-
展平数组(降成一维)
>>> b = array(([[[1,2,3], [4,5,6]], [[7,8,9], [10,11,12]]])) >>> b.ravel() # 不改变原数组 array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) >>> b.flatten() # 不改变原数组 array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
-
设置维度
元素个数要与设置的维度相匹配,不然会报错
>> b.shape = (2,6) # 改变原数组,变为2×6的数组,[[1,2,3,4,5,6],[7,8,9,10,11,12]] >> b.resize((4,3)) # 改变原数组,变为4×3的数组 >> b.reshape((3,4)) # 不改变原数组,返回3×4的数组
-
数组转置
>>> b = array([[1,2,3,4]]) >>> b.transpose() # 不改变原数组,返回转置后的数组,[[1],[2],[3],[4]] >>> b.T # 同上
1.4 数组的组合
先产生一些数组
>>> a = arange(9).reshape(3,3) >>> b = arange(11,14).reshape(1,3) >>> c = 2*a >>> a array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> b array([[11, 12, 13]]) >>> c array([[ 0, 2, 4], [ 6, 8, 10], [12, 14, 16]])
-
水平组合
>>> hstack((a,b.T)) array([[ 0, 1, 2, 11], [ 3, 4, 5, 12], [ 6, 7, 8, 13]]) >>> concatenate((a,b.T),axis=1) array([[ 0, 1, 2, 11], [ 3, 4, 5, 12], [ 6, 7, 8, 13]])
-
垂直组合
>>> vstack((a,b)) array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [11, 12, 13]]) >>> concatenate((a,b),axis=0) # concatenate函数axis参数默认为0,垂直组合 array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [11, 12, 13]])
-
深度组合
>>> dstack((a,c)) array([[[ 0, 0], [ 1, 2], [ 2, 4]], [[ 3, 6], [ 4, 8], [ 5, 10]], [[ 6, 12], [ 7, 14], [ 8, 16]]])
-
列组合
>>> column_stack((b,b)) array([[11, 12, 13, 11, 12, 13]]) # 对于二维数组,相当于hstack
-
行组合
>>> row_stack((b,b)) array([[11, 12, 13], [11, 12, 13]]) # 对于二维数组,相当于vstack
1.5 数组的分割
-
水平分割
>>> hsplit(a,3) [array([[0], [3], [6]]), array([[1], [4], [7]]), array([[2], [5], [8]])] >>> split(a,3,axis=1) # 与hsplit相同
-
垂直分割
>>> vsplit(a,3) [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])] >>> split(a,3,axis=0) # 与vsplit相同
-
深度分割
>>> d = arange(8).reshape(2,2,2) >>> dsplit(d,2) [array([[[0], [2]], [[4], [6]]]), array([[[1], [3]], [[5], [7]]])]
网友评论