利用python进行数据分析(二):Numpy数组

来源:互联网 发布:美工基础知识 编辑:程序博客网 时间:2024/05/17 23:40

使用前 import numpy as np
Numpy的重要特点是ndarray数组,里面存储的必须是同一种对象。
data.dtype 可以查看数组data里面元素的类型。
data.shape 可以查看数组data的大小。
(1)数组的创建
np.array(列表) 直接将列表转换为数组。
np.zeros(n) np.ones(n) 可以直接生成长度为n的一维全零数组。
np.zeros((m,n)) np.ones((m,n)) 可以直接生成(m,n)的二维全零或全一数组。高维数组的生成也是一样。
np.arange(15) 生成一维数组,数组里是0-14。

   np.arange(15)   Out[5]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

np.ones_like()、np.zeroslike()根据某一个数组的形状来创建新的数组。

(2)关于数组的类型
可以在建立数组的时候指定,也可以在传入后再修改(使用np内置的astype函数)。

s=array(['1.73', '4.5', '7.88'],        dtype='np.string_')s=s.astype('np.float64')

(3)python对于数组、列表
当你创建一个对象,然后把它复制给另一个变量的时候,Python并没有拷贝这个对象,而是拷贝了这个对象的引用。
如果用C语言的角度,相当于只是将地址进行了传递,虽然两个变量名不一样,但是实际的地址却是一样的。
比如

>>> a=[1,4,5]>>> b=a>>> b[1, 4, 5]>>> a[2]=1>>> a[1, 4, 1]>>> b[1, 4, 1]

可以使用b=a.copy() 这样b就是a的副本,而不是指向同一个地址。就不会出现这种浅拷贝的情况。
需要注意的是
1)浅拷贝的现象只会出现在数组、列表等对象中,对int、float等单个元素不会出现。
2)如果不是改变部分分元素,而是直接赋给a一个新的列表,比如a=[3,4,5],那么b并不会跟着变化。
(4)标量与数组的运算是 这个标量与数组每个元素做运算

cOut[27]:array([5, 6, 7])In [28]:c+3Out[28]:array([ 8,  9, 10])

这种机制叫做广播,需要注意的是 只有数组才有这种属性,列表并没有。
(5)要调取一个数组(比如数组名为a,大小为2*2)的某一个元素,两种方式是等价的:

a[0][1]a[0,1]

(6)要找数组里所有的同一个元素,可以使用布尔型索引
data=array([‘Bob’,’Will’,’Sam’])

data[data==’Bob’] 

data==’Bob’返回一个bool类型的数组。可以作为索引使用

  data[data<0]=0

data中所有小于0的数全部置为0
(7)花式索引——利用整数型数组(整数列表)来作为索引

arr[[4,3,0,6]]

选择arr的第4,3,0,6四行组成新的数组。
(8)数组的转置属性和内积方法。
arr.T可以得到arr的转置矩阵
内积(np.dot)就是矩阵乘法。

np.dot(arr.T,arr)

多维矩阵的转置:

arr=np.arange(16).reshape((2,2,4))arr.transpose((1,0,2))     

第0维和第1维转置,第二维不变。
(9)Numpy中的通用函数

np.arrange(n)           #生成一维数组,数组里是0-n-1。np.random.randn()np.sqrt(arr)            #对数组arr里的每个元素开方np.exp(arr)             #对数组arr里的每个元素x  求exp(x)np.square()   np.abs()np.random.randn(8)      #产生长度为8服从标准正态分布的一维随机数数组np.random.randint(8)    #产生0-8的一个随机整数'''

(10)利用数组做数据处理

np.meshgrid(x,y)

接收两个一维数组,并产生两个二维矩阵,对应两个数组中所有的(x,y)对

(11)矢量化运算
np.where()是 x if condition else y的矢量化版本,矢量化的运算要比循环更快。

 result=np.where(cond,xarr,yarr)

cond,xarr,yarr,result是同等大小的数组。
cond里面元素为真(不为0)的时候result该位置的元素取xarr对应元素的值,否则取yarr对应元素的值。
第二个和第三个参数不一定是数组,也可以是标量。比如:

 result=np.where(cond,2,3)

cond里面元素为真(不为0)的时候result该位置的元素取2,否则取3。

(12)数组的数学统计
对数组可以直接使用np.mean、np.sum、np.std(标准差)、np.var(方差)、np.max、np.min、np.argmax、np.argmin等函数,也可以作为数组的属性来使用。
cumsum()和cumprod()分别可以实现数组中元素的累加和累乘。

(13)布尔型数组的用法
对于bool型数组arr: arr.sum()可以统计True的个数。arr.all()检查是否全是True,arr.any()检查是否有True。

(14)数组的唯一化

np.unique(arr)   #返回一个数组,数组中的元素是arr去除了重复元素的结果

(15)数组的文件输入和输出
np.save()和np.load()是读写磁盘数据的两个函数,save将数组保存在扩展名.npy的文件中,如果不写.npy的话,系统在存储的时候会自动添加。

np.save('some_array.npy',arr)arr_new=np.load('some_array.npy')

savez()可以同时保存多个数组到.npz文件中,读取时会得到一个类似于字典的对象,如果不写.npz的话,系统在存储的时候会自动添加。

savez('some_array',a=arr1,b=arr2)new_arr=np.load('some_array.npz')new_arr['b']

(16)线性代数
numpy.linalg 里面有很多用于矩阵的函数 ,如inv —–求逆 det—–求行列式
svd —–奇异值分解 qr —-计算qr分解

 from numpy.linalg import inv,qr mat=X.T.dot(X) inv(mat) q,r=qr(mat)

(17)随机数生成

np.random.randn(8)      #产生长度为8服从标准正态分布的一维随机数数组np.random.randint(8)    #产生0-8的一个随机整数np.random.randn(8,8)    #产生8*8服从标准正态分布的随机数数组

(18)连接两个数组

np.concatenate([arr1,arr2])             #默认axis=0np.concatenate([arr1,arr2],axis=1)

(19)Numpy的matrix类
Numpy提供了一个matrix类,直接使用×就是矩阵乘法,不需要再使用dot函数。
X是一个二维数组。

Xm=np.matrix(X)       #转成矩阵ym=Xm[:,0]            #取第一列ym.T*Xm*ym            #做矩阵乘法,其中,.T是转置  。
Xm.I   #求Xm的逆。
np.asnarray()  #将matrix类转换回正规的ndarray

(20)数组删除行和列

data = np.delete(data, -1, axis=1)   #删除最后一列data = np.delete(data, -1, axis=0)   #删除最后一行
阅读全文
0 0
原创粉丝点击