0%

Python-Numpy笔记

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函数,另外还有savesavez等函数用于二进制文件

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_andnp.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列数组,可以用shapereshape;后者更加常用,因为可以不用改变原始数据;后来发现还有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()

参考资料:
【Python数据分析】Numpy的详细教程

本文出自于http://www.bioinfo-scrounger.com转载请注明出处