您的位置:首页 > 编程语言 > Python开发

Python数据分析|第4章 NumPy基础:数组和矢量计算

2016-12-21 09:48 951 查看

NumPy的ndarray: 一种多维数组对象

import numpy as np
data1=[6,7.5,8,0,1]
arr1=np.array(data1)
arr1
Out[6]: array([ 6. ,  7.5,  8. ,  0. ,  1. ])


ndarray的数据类型

arr1=np.array([1,2,3],dtype=np.float64)
arr1.dtype
Out[8]: dtype('float64')

float_arr=arr1.astype(np.float64)
float_arr.dtype
Out[11]: dtype('float64')


基本的索引和切片

数组切片是原始数组的视图。数据不会被复制,所有改动都直接反映到源数组上。

arr=np.arange(10)
arr_slice=arr[5:8]
arr_slice[1]=12345
arr
Out[15]: array([    0,     1,     2,     3,     4,     5, 12345,     7,     8,     9])


· 布尔型索引

names=np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
data=np.random.randn(7,4)

names=='Bob'
Out[20]: array([ True, False, False,  True, False, False, False], dtype=bool)

##否定
data[names=='Bob']
Out[21]:
array([[-0.39877027, -0.01178561, -0.68805379,  0.24003537],
[-0.49070599, -0.77271125, -0.78451039, -0.55892465]])

data[names=='Bob',2:]
Out[22]:
array([[-0.68805379,  0.24003537],
[-0.78451039, -0.55892465]])

names!='Bob'
Out[23]: array([False,  True,  True, False,  True,  True,  True], dtype=bool)

data[-(names=='Bob')]
Out[24]:
array([[ 0.60224298, -0.34308737, -0.54872007,  1.58333353],
[ 1.56502808, -0.09735683,  1.60240475,  1.72841288],
[-0.2879586 ,  0.34864156,  2.06877779, -0.99745178],
[-0.44044003,  1.27772298,  0.2471246 , -0.56926549],
[-0.40335892, -0.08190266,  0.19201863, -0.16907557]])

data[data<0]=0
data
Out[26]:
array([[ 0.        ,  0.        ,  0.        ,  0.24003537],
[ 0.60224298,  0.        ,  0.        ,  1.58333353],
[ 1.56502808,  0.        ,  1.60240475,  1.72841288],
[ 0.        ,  0.        ,  0.        ,  0.        ],
[ 0.        ,  0.34864156,  2.06877779,  0.        ],
[ 0.        ,  1.27772298,  0.2471246 ,  0.        ],
[ 0.        ,  0.        ,  0.19201863,  0.        ]])


· 花式索引(与切片不同,会复制到新数组)

arr=np.empty((8,4))
for i in range(8)

for i in range(8):
arr[i]=i

arr
Out[30]:
array([[ 0.,  0.,  0.,  0.],
[ 1.,  1.,  1.,  1.],
[ 2.,  2.,  2.,  2.],
[ 3.,  3.,  3.,  3.],
[ 4.,  4.,  4.,  4.],
[ 5.,  5.,  5.,  5.],
[ 6.,  6.,  6.,  6.],
[ 7.,  7.,  7.,  7.]])

arr[[4,3,0,6]]
Out[31]:
array([[ 4.,  4.,  4.,  4.],
[ 3.,  3.,  3.,  3.],
[ 0.,  0.,  0.,  0.],
[ 6.,  6.,  6.,  6.]])

arr[[-3,-5,-7]]#从末尾开始选行
Out[32]:
array([[ 5.,  5.,  5.,  5.],
[ 3.,  3.,  3.,  3.],
[ 1.,  1.,  1.,  1.]])

##reshape
arr=np.arange(32).reshape((8,4))
arr
Out[35]:
array([[ 0,  1,  2,  3],
[ 4,  5,  6,  7],
[ 8,  9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31]])

arr[[1,5,7,2],[0,3,1,2]]
Out[36]: array([ 4, 23, 29, 10])

##以下两种方式结果一样
arr[[1,5,7,2]][:,[0,3,1,2]]
arr[np.ix_([1,5,7,2],[0,3,1,2])]
Out[38]:
array([[ 4,  7,  5,  6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11,  9, 10]])


数组转置和轴对换

arr.T #转置
np.dot(arr.T,arr) #计算内积

##高维
arr=np.arange(16).reshape((2,2,4))
Out[44]:
array([[[ 0,  1,  2,  3],
[ 4,  5,  6,  7]],
[[ 8,  9, 10, 11],
[12, 13, 14, 15]]])

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

arr.swapaxes(1,2)#也是直接返回源数据
Out[45]:
array([[[ 0,  4],
[ 1,  5],
[ 2,  6],
[ 3,  7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])


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

(1) 一元

函数说明
abs、fabs绝对值
sqrt、square、exp平方根、平方、指数
log、log10、log2、log1p底数为e、底数为10、底数为2的log、log(1+x)
sign计算正负号
ceil计算ceiling值,>=该值最小整数
floor计算floor值,<=该值最大整数
rint四舍五入到最接近的整数
modf将数组小数和整数以两个独立数组形式返回
isnan、isfinite、isinf返回是否符合相应逻辑的判断值
cos、cosh、sin、sinh、tan、tanh三角函数
arc-反三角函数
logical_not计算not x的真值
(2) 二元

函数说明
add、subtract、multiple、divide、floor_divide、power运算
maximum、fmax、minimum、fmin最大、小值,fX将忽略NaN
mod
copysign将第二个数组中的值符号复制给第一组
greater、greater_equal、less、less_equal、equal、not_equal等于>、>=、<、<=、==、!=
logical_and、logical_or、logical_xor相当于&、

利用数组进行数据处理

将条件逻辑标书为数组运算numpy.where

xarr=np.array([1.1,1.2,1.3,1.4,1.5])
yarr=np.array([2.1,2.2,2.3,2.4,2.5])
cond=np.array([True,False,True,True,False])
result=np.where(cond,xarr,yarr) #条件,如符合,如不符合
result
Out[57]: array([ 1.1,  2.2,  1.3,  1.4,  2.5])

np.where(arr>0,2,-2)

##如果符合条件1和2,则0,否则符合条件1则1,否则符合条件2则2,否则3
np.where(cond1 & cond2, 0,
np.where(cond1, 1,
np.where(cond2, 2, 3)))


数学和统计方法

arr=np.random.randn(5,4)
arr.mean()
Out[59]: -0.14329050690771383


方法说明
sum、mean、std、var、min、max运算
argmin、argmax分别为最大和最小元素索引
cumsum所有元素累计和
cumprod所有元素累计积

用于布尔型数组的方法

arr=np.random.randn(100)
(arr>0).sum()
Out[63]: 52

##测试是否有一个以上True或是否都是True
bools=np.array([False,False,True])
bools.any()
Out[65]: True
bools.all()
Out[66]: False


排序

##想把某一列位置前移,可直接在sort()中标注该列位置
arr=np.random.randn(2,3)

arr
Out[75]:
array([[ 0.60516471, -0.73649432, -0.14199722],
[ 0.82663579,  1.71313644, -0.2253516 ]])

arr.sort(1)

arr
Out[77]:
array([[-0.73649432, -0.14199722,  0.60516471],
[-0.2253516 ,  0.82663579,  1.71313644]])

## 计算分位值
large_arr=np.random.randn(1000)

large_arr[int(0.05*len(large_arr))] #5%分位数
Out[79]: 1.282214462184516


唯一化以及其他的集合逻辑

ints=np.array([3,3,3,2,2,1,1,4,4])

np.unique(ints)
Out[81]: array([1, 2, 3, 4])

values=np.array([6,0,0,3,2,5,6])

np.in1d(values,[2,3,6]) #测试该数组在另一个数组中的成员资格
Out[83]: array([ True, False, False,  True,  True, False,  True], dtype=bool)


方法说明
unique(x)计算x中的唯一元素
intersect1d(x,y)计算x和y中公共元素
union1d(x,y)计算并集
in1d(x,y)x里面有没有y元素
setdiff1d(x,y)集合的差,即元素在x中不在y中
setxor1d(x,y)集合的对称差,存在于一个数组但不同时存在于两个数组

用于数组的文件输入输出

将数组以二进制格式保存到磁盘

arr=np.arange(10)

np.save('some_array',arr) #存成npy格式

np.load('some_array.npy') #读取
Out[86]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

np.savez('array_archive.npz',a=arr,b=arr) #存成压缩文件

arch=np.load('array_archive.npz')

arch['b']
Out[89]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])


存取文本文件

arr=np.loadtxt('XXX.txt', delimiter=',') #逗号为分隔符的文本文件


线性代数

from numpy.linalg import inv,qr
X=np.random.randn(5,5)

mat=X.T.dot(X)

inv(mat)
Out[97]:
array([[ 0.39210002, -0.02964083, -0.26097362, -0.01251355,  0.12135067],
[-0.02964083,  0.3425748 , -0.16424676, -0.17248573, -0.22643222],
[-0.26097362, -0.16424676,  1.26087367,  0.51118244,  0.76228606],
[-0.01251355, -0.17248573,  0.51118244,  0.6761558 ,  0.67316282],
[ 0.12135067, -0.22643222,  0.76228606,  0.67316282,  1.13718232]])


常用的numpy.linalg函数

函数说明
diag以一维数组的形式返回方阵的对角线元素
dot矩阵乘法
trace计算对角线之和
det行列式
eig本征值和本征向量
inv
pinvMoore-Penrose伪逆
qrQR分解
svd奇异值分解
solve解Ax=b,其中A为一个方阵
Istsq计算Ax=b的最小二乘解

随机数生成

samples=np.random.normal(size=(4,4))


函数说明
seed确定随机数生成器种子
permutation返回一个序列的随机排列或随机排列的范围
shuffle对一个序列就地随机排列
rand产生均匀分布的样本值
randint从给定上下范围内随机选取整数
randn产生正态分布的样本值
binomial产生二项分布的样本值
normal正态分布
betaBeta分布
chisquare卡方分布的样本值
gammaGamma分布
uniform[0,1)中均匀分布的样本值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 数据分析