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 | 逆 |
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)中均匀分布的样本值 |