Python用了有一段时间了,平时用到Numpy的时候,都是随用随查,这次抽时间整理下常用的用法
NumPy(Numerical Python)是 Python 中的一个线性代数库,在数组矩阵运算、逻辑运算以及Scikit-learn、pandas和tensorflow等包中被大量使用 > NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(通常是元素是数字)。在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank)。
比如以下数组a为二维数组,也叫rank 2 array
import numpy as np
a = np.array([[1, 2], [3, 4]])
NumPy的N维数组类被称作ndarray,一些Numpy常用的函数是都可基于ndarray数组,跟array并不一样
创建数组
创建数组,除了上述方法外,还有一些常用函数来创建空数据,元素均为0或1的数组,常量数组,单位矩阵,随机数数组等
np.empty([3,2], dtype = int)
np.zeros([3,2])
np.ones([4,3])
np.full((2,2), 7)
np.eye(4)
np.random.random([2,1])
还有个y = np.empty_like(x),用于创建一个跟x一样的类型的y数组
如果数据来源于txt格式的文件,则可以用loadtxt()函数
c = np.genfromtxt("1.txt", skip_header=1)
有读入肯定也有保存,如savetxt函数,另外还有save、savez等函数用于二进制文件
np.savetxt('out.txt', c, delimiter='\t')
PS.一般都不用Numpy来读写文件,还有Pnadas更好用呢。。。
查看数组类型,如shape返回数组的维度(即n行m列),ndim返回秩(也可说是轴的个数),size返回数组元素总数,dtype返回数组元素类型:
data = np.array([[1, 2, 3], [4, 5, 6]])
data.shape
>> (2, 3) # 2行3列
data.ndim
>> 2
data.size
>> 6
data.dtype
>> dtype('int32')
数组运算
数组的数学运算,常见的有:
最大值data.max(axis = 1)(每行),求和data.sum(axis = 1),最小值、平均值、中位数等依次类推
以e取幂np.exp(data),以2为底的幂运算np.power(data,2),平方根np.sqrt(data),自然对数np.log(data)
标准差np.std(data, axis = 0)(每列),相关系数np.corrcoef(data)(各个rank之间的相关系数)
加法np.add,减法np.subtract,乘法np.multiply,除法np.divide,除余np.remainder
矩阵乘法np.dot(data, data)或者data.dot(data)
比较两数组是否相等np.array_equal
逻辑运算比如AND/OR/NOT,可以用np.logical_and,np.logical_or(),np.logical_not();比如np.logical_and(array([ True, True, False, False], dtype=bool), array([ True, False, True, False], dtype=bool))
数据索引切片
数组索引,也叫数组切片,一维数组跟Python基础列表操作一样,多维数组每个轴都有一个索引,以逗号分隔;
b = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
b[:,1]
>> array([ 2, 6, 10])
b[0:2,1:2]
>> array([[2],
[6]])
b[[1,2]] # 取1-2行
>> array([[ 5, 6, 7, 8],
[ 9, 10, 11, 12]])
索引还可以用数组表示:
a = np.arange(12)
i = [1,2,3]
a[i]
>> array([1, 2, 3])
如果索引是多维数组的话:
j = np.array([[1,2],[6,7]])
a[j]
>> array([[1, 2],
[6, 7]])
如果需要去特定行以及列的话,则:
a = np.arange(32).reshape((8,4))
a[[1,3,5,7]][:,[1,2,3]]
但还可用np.ix_来更加灵活的获取数组
np.ix_([1,3,5,7],[1,2,3]) # ix_方法
a[np.ix_([1,3,5,7],[1,2,3])]
还有take方法来去特定行列
a.take([1,2],axis = 1) # 2,3列
a.take([1,2],axis = 0) # 2,3行
可以切片当然也能赋值
a[[1,2,3]] = 0
a
>> array([ 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 10, 11])
也可以被迭代循环
a = np.array([[1,2,3],[4,5,6]])
for i in a: print(i)
>> [1 2 3]
[4 5 6]
如果想历遍所有元素,则用flat属性
for i in a.flat: print(i)
数组操作
比如flatten the array,可用ravel函数
a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
a.ravel
变成4行3列数组,可以用shape和reshape;后者更加常用,因为可以不用改变原始数据;后来发现还有resize,跟shape一样直接改变原始数据
a.shape = (4,3)
b = np.reshape(a, (4,3))
a.resize((4,3))
可用transpose函数转置,或者用T
b = a.transpose()
b = a.T
合并数组,分为行合并和列合并(跟R的rbind和cbind一样意思)
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.vstack((a,b)) # 等于rbind,行合并
np.r_[a,b] # 同上
np.hstack((a,b)) # 等于cbind,列合并
np.c_[a.b] # 同上
np.column_stack((a, b)) # 同上
还可以连接数组
np.concatenate((np.array([1,2,3]),np.array([4,5,6])))
有了合并,必然也有分割,这里的hsplit第2个参数如果是单个数值,则说明要分成几份(相同的);如果是数组或者元组等,则说明要以某几列作为分割
a = np.array([[1,3,5,7],[2,4,6,8]])
np.hsplit(a, 2)
np.hsplit(a, np.array([1, 2])) # 注意
np.split(a 2, axis = 1) # 同hsplit
np.vsplit(a, 2)
np.split(a 2, axis = 0) # 同vsplit
添加数组,可用np.append;还有插入np.insert和删除np.delete
a = np.array([[1,3,5],[2,4,6]])
np.append(a, [[7],[8]])
>> [1 3 5 2 4 6 7 8]
np.append(a, [[7],[8]], axis = 1)
>> [[1 3 5 7]
[2 4 6 8]]
np.insert(a, 1, [[7],[8]], axis = 1)
>> array([[1, 7, 8, 3, 5],
[2, 7, 8, 4, 6]])
np.delete(a, [0,1], axis = 1)
>> array([[5],
[6]])
查询帮助文档
两个函数可以查询Numpy一些函数/方法的用法,如:
np.lookfor("mean")
还有个就是常用的:help()