python:NumPy基础(4),总结

利用python进行数据分析

第四章:NumPy基础:数组和矢量计算

总结

1,创建ndarray

利用np.array()函数
>>> import numpy as np
>>> np.array([1.2, 4.5, 7.1, 9.0])
array([ 1.2, 4.5, 7.1, 9. ])
数组类型:dtype,整型多为int32,浮点型多为float64
另外包括布尔型(bool),字符串型(string_)
>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
转换数组类型:
np.array().astype(np.float64)或np.string_
数组和标量之间的运算都会应用到元素级别
索引切片和列表切片的用法相同,索引从0开始,取出数组元素包括开始索引但不包括结束索引。
但要重点注意一下方面:数组的切片都是原始数组的视图,所以切片后的数据不是被复制出来的,而是原有数组的应用,切片后的数组改动后原有数组也会改变,如果想对切片结果进行复制则需要,类似arr[5:8].copy()这样的操作
高维数组的一个索引对象,实际上得到的结果是一个降维的数组
通过数组的比较运算(如==,也叫矢量化)可得到一个布尔型数组
>>> names == 'Joe'
array([False, True, False, False, False, True, True], dtype=bool)
>>> data[names=='Joe'] #names==’Joe’返回的是一个布尔型数组,通过布尔型判断,可以将True的结果应用到data数组, 可提取data数组当中[1, 5, 6]索引值(即True所对应的索引值)对应的行
array([[ 0.14639488, 0.50852123, 1.66392483, -0.35788218],
[-2.37959869, -0.54363359, -0.72653964, -0.2870257 ],
[ 0.43296343, -0.28575067, 2.16272556, 0.15922052]])
>>> data[~(names=='Joe')] #表示布尔值的反向索引,提取False所对应的索引值的行内容
数组的转置np.array([]).T,即数组对象后面加.T

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

通用函数(即ufunc)是一种ndarray中的数据执行元素级运算的函数。
例如:
>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.square(np.arange(10)) #计算数组中各元素的平方
array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81])
>>> np.maximum(x, y) #比较两个数组返回两个数组对应索引的元素比较结果的最大值
>>> np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(10,0,-1)
array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1])
>>> np.maximum(np.arange(10), np.arange(10,0,-1))
array([10, 9, 8, 7, 6, 5, 6, 7, 8, 9])
表4-3和表4-4当中常用的一元和二元通用函数要记住

3,利用数组进行数据处理

利用数组运算实现分支结构判断
numpy.where函数是三元表达式x if condition else y的矢量化版本,表达式写法为:
result=numpy.where(condition, xarray, yarray)
result=numpy.where(condition, xnumber, ynumber)
其能够实现根据condition(一般为布尔型数组)中的值选取xarray数组及yarray数组的值,当condition中的值为True时,选取xarray的值,否则选取yarray中的值。根据上面的筛选工作,得到一个result数组。

如果存在两个布尔型数组,也可利用上述方法实现如下的分支结构:
>>> result=[]
>>> for i in range(n):
... ····if cond1[i] and cond2[i]:
... ········result.append(0)
... ····elif cond1[i]:
... ········result.append(1)
... ····elif cond2[i]:
... ········result.append(2)
... ····else:
... ········result.append(3)
如果两个表达式都为True,则result为0
如果第一个表达式为True,则result为1
如果第二个表达式为True,则result为2
如果两个表达式都不为True,则result为3
>>> np.where(cond1 & cond2, 0, np.where(cond1, 1, np.where(cond2, 2, 3)))
>>> 1 * (~cond2 & cond1) + 2 * (cond2 & ~cond1) + 3 * ~(cond1 | cond2)

表4-5:基本数组统计方法通用函数要记住

在布尔型数组方法中,布尔值会被强制转换为1(True)和0(False),可利用sun统计布尔型数组中的True值计数:
(numpy.random.randn(100) > 0 ).sum() #得到数组中正值的个数

排序运算
>>> arr=randn(9)
>>> arr
array([-0.69778284, 0.30313787, 0.52890605, 0.11275467, 0.32922109, 0.10299694, -0.61234129, -0.59846439, -0.96847564])
sort默认是升序排序,
np.sort(array) 返回一个排序后的对象
arr.sort()直接修改原来的数组得到排序后的结果
>>> -np.sort(-arr, kind='quicksort') #实现降序排序
array([ 0.52890605, 0.32922109, 0.30313787, 0.11275467, 0.10299694, -0.59846439, -0.61234129, -0.69778284, -0.96847564])

np.unique()实现数组元素的唯一化
np.in1d(values, [2, 3, 6])检测values数组中的值在[2, 3, 6](列表对象或者数组对象均可)中的成员资格,返回一个布尔型数组

表4-6当中数组的集合运算函数,与set()集合运算作用相同

数组的文件输入输出,np.save保存文件
>>> arr=np.arange(10)
>>> np.save('some_array', arr)
将数组arr,保存到some_array文件中,保存的文件扩展名为.npy(保存文件后扩展名自动加上)
np.load读取数组文件
>>> np.load('some_array.npy')
通过np.savez可以将多个数组保存到一个压缩文件中,需要传入数组关键字。
>>> np.savez('array_archive.npz', a=arr, b=arr)
np.load读取array_archive.npz文件,得到字典对象,通过键[‘a’]或[‘b’]得到压缩时传入的数组

存取文本文件
>>> np.loadtxt('array_ex.txt', delimiter=',')
delimiter表示读取文件内的分隔符
np.savetxt将数组写入以某种分隔符隔开的文本文件中
>>> no.savetxt('file_np.txt', arr) #默认以空格分隔

线性代数运算

随机数生成
表4-8:部分numpy.random函数

你可能感兴趣的:(python,python_numpy)