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

时间:2021-12-16 00:24:34

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)

##如果符合条件12,则0,否则符合条件11,否则符合条件22,否则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
pinv Moore-Penrose伪逆
qr QR分解
svd 奇异值分解
solve 解Ax=b,其中A为一个方阵
Istsq 计算Ax=b的最小二乘解

随机数生成

samples=np.random.normal(size=(4,4))
函数 说明
seed 确定随机数生成器种子
permutation 返回一个序列的随机排列或随机排列的范围
shuffle 对一个序列就地随机排列
rand 产生均匀分布的样本值
randint 从给定上下范围内随机选取整数
randn 产生正态分布的样本值
binomial 产生二项分布的样本值
normal 正态分布
beta Beta分布
chisquare 卡方分布的样本值
gamma Gamma分布
uniform [0,1)中均匀分布的样本值