python 数据分析一:numpy常规用法

本人最近在读《利用python进行数据分析》一书,将上面的知识点进行总结一下,以后每天都更新一下;

每天进步一点点

数学名词:

数学和统计方法
mean 算数平均数
std  标准差
var 方差

自由度
在统计学中,自由度(degree of freedom, df)指的是计算某一统计量时,取值不受限制的变量个数。通常df=n-k。其中n为样本数量,
k为被限制的条件数或变量个数,或计算某一统计量时用到其它独立统计量的个数。自由度通常用于抽样分布中。

随机变量
随机事件的发生的数值

期望值(数学期望;算数平均数)
随机事件的发生的平均值μ


方差
方差是实际值与期望值之差平方的平均值,σ^2

标准差
标准差是方差算术平方根。

正态分布
若随机变量X服从一个数学期望为μ、方差为σ^2的正态分布,记为N(μ,σ^2)。其概率密度函数为正态分布的期望值μ决定了其位置,
其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。



# -*- coding: utf-8 -*-
import numpy as np

#ndarray是一种多维数组对象
data=([[0.123,-0.32324,-0.8454],[0.43242,0.45322,0.765]])

#1.转换为多维数组   也就是矩阵
data=np.array(data)
print(data)
# [[ 0.123   -0.32324 -0.8454 ]
#  [ 0.43242  0.45322  0.765  ]]

#2.多维数组的运算
print(data*10)
# [[ 1.23   -3.2324 -8.454 ]
#  [ 4.3242  4.5322  7.65  ]]

print(data+data)
# [[ 0.246   -0.64648 -1.6908 ]
#  [ 0.86484  0.90644  1.53   ]]

#3.获取维度的数组
print(data.shape)
#(2, 3)  说明是一个2行三列的矩阵

#4.创建一个多维数组
data=[6,6.5,7,0,1]
data=np.array(data)
print (data)#[6.  6.5 7.  0.  1. ]

#5.获取维度
print(data.ndim)#1

#6.创建一个二维数组
data2=np.array([[1,2,3,4],[5,6,7,8]])
print(data2.ndim)#2
print(data2.shape)#(2, 4)

#7.获取数组的数据类型
print(data.dtype)#float64
print(data2.dtype)#int32

#8.返回全是0的数组
print(np.zeros((2,3,2)))
# [[[0. 0.]
#   [0. 0.]
#   [0. 0.]]
#
#  [[0. 0.]
#   [0. 0.]
#   [0. 0.]]]

#9.返回都是1的数组
print(np.ones((2,3)))
# [[1. 1. 1.]
#  [1. 1. 1.]]

#10.初始化的垃圾数据
print(np.empty((2,3,3)))

#11.ndarray的数据类型
data=np.array([1,2,3],dtype=np.float64)
print(data.dtype)#float64  设定数据类型

#转换数据类型
data=np.array([1,23,4])
print(data.dtype)#int32

data=data.astype(np.float64)

print(data.dtype)#float64

#浮点型转换为整形
data=np.array([1.23,31.42,3124.1231])
data=data.astype(np.int32)
print(data)#[   1   31 3124]

#字符串转换
data=np.array(['1.2','2.3','3.4'])
data=data.astype(np.float64)
print(data)#[1.2 2.3 3.4]

#当两个数组进行计算的时候,可以这样
data=np.array([1,2,3])
print(data.dtype)#int32
asdata=np.array([0.2,0.34,0.78],dtype=np.float64)
data=data.astype(asdata.dtype)

print(data.dtype)#float64




# -*- coding: utf-8 -*-
import numpy as np

'''
数组与矢量的运算
'''
arr=np.array([[1,2,3],[4,5,6]])
#乘
print(arr*arr)
# [[ 1  4  9]
#  [16 25 36]]

#减
print(arr-arr)
# [[0 0 0]
#  [0 0 0]]

#除
print(1/arr)
# [[1.         0.5        0.33333333]
#  [0.25       0.2        0.16666667]]

#根号1/2
print(arr**0.5)
# [[1.         1.41421356 1.73205081]
#  [2.         2.23606798 2.44948974]]

'''
基本的索引和切片
广播,数组不会复制,更改后会传播到所有的区域
'''
arr=np.arange(10)
print(arr)#[0 1 2 3 4 5 6 7 8 9]
arr[5:8]=12
print(arr)#[ 0  1  2  3  4 12 12 12  8  9]

arr2=arr[5:8]
arr2[1]=1000
print(arr)#[   0    1    2    3    4   12 1000   12    8    9]
arr2[:]=10
print(arr)#[ 0  1  2  3  4 10 10 10  8  9]


'''
多维数组
'''
arr=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr)
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]

print(arr[1,1])#5,第二行,第二列

arr=np.array([[[1,2,3],[4,5,6]],[[6,7,8],[9,10,11]]])
print(arr)
# [[[ 1  2  3]
#   [ 4  5  6]]
#
#  [[ 6  7  8]
#   [ 9 10 11]]]

print(arr[1,1,1])#10
#先复制一份
arrCopy=arr[0].copy()
arr[0]=0
print(print(arr))
# [[[ 0  0  0]
#   [ 0  0  0]]
#
#  [[ 6  7  8]
#   [ 9 10 11]]]

#复制广播将不生效
arr[0]=arrCopy
print(arr)
# [[[ 1  2  3]
#   [ 4  5  6]]
#
#  [[ 6  7  8]
#   [ 9 10 11]]]


'''
多维的切片索引
'''

arr=np.array([[1,2,3],[4,5,6],[7,8,9]])
#这里可以把':'看成一个轴
print(arr)
# [[1 2 3]
#  [4 5 6]
#  [7 8 9]]
print(arr[:2])#获取第三行之前的两行,切记不含二行之前
# [[1 2 3]
#  [4 5 6]]

print(arr[1:,:2])#二行之后,包含二行,三列之前,不含三列
# [[4 5]
#  [7 8]]

print(arr[1,:2])#这就时第二行,第三列之前的数据
#[4 5]

print(arr[:,:1])#二列之前
# [[1]
#  [4]
#  [7]]


'''
难点:布尔型索引
'''
'''
随机变量
随机事件的发生的数值

期望值(数学期望;算数平均数)
随机事件的发生的平均值μ


方差
方差是实际值与期望值之差平方的平均值,σ^2

标准差
标准差是方差算术平方根。

正态分布
若随机变量X服从一个数学期望为μ、方差为σ^2的正态分布,记为N(μ,σ^2)。其概率密度函数为正态分布的期望值μ决定了其位置,
其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。

'''

#生成一些正太分布的随机数据
data=np.random.rand(7,4)
print(data)
# [[0.27756743 0.92553217 0.4376027  0.65185527]
#  [0.04030365 0.71891506 0.47290026 0.99950573]
#  [0.11455701 0.12167461 0.18145921 0.72137363]
#  [0.11932886 0.49777938 0.90794486 0.76765448]
#  [0.77329391 0.75949706 0.53619447 0.64690519]
#  [0.75853935 0.01169816 0.33512101 0.23201947]
#  [0.18895293 0.9876868  0.32563939 0.29345237]]

names=np.array(['bob','joe','will','bob','will','joe','joe'])
print(names)

'''
假设每个名字对应data数组的一行,而我们想要选择对应名字的bob的所有行   names和字符bob产生一个bulr的数组
'''
print(names=='bob')#[ True False False  True False False False]

print(data[names=='bob'])#获取第一行和第四行的数据
# [[0.77523105 0.27947329 0.89289972 0.20312933]
#  [0.46598067 0.14252597 0.42223596 0.34001168]]

#组合使用获取切片数组,切去第三列后的数据
print(data[names=='bob',2:])
# [[0.89289972 0.20312933]
#  [0.42223596 0.34001168]]

#设置!=
print(data[names!='bob'])
# [[0.04343977 0.58110752 0.88324083 0.72230267]
#  [0.43153165 0.14525111 0.07471861 0.8670083 ]
#  [0.9430179  0.00522972 0.05577508 0.63539824]
#  [0.81805448 0.21117292 0.21641448 0.13514152]
#  [0.38560434 0.89964309 0.19432445 0.46441979]]


#使用&;|
print(data[(names=='bob')|(names=='will')])#将正态分布的随机数,与现实数组条件结合,获取符合条件的正太分布数组
# [[0.59044687 0.62773976 0.29894288 0.36165262]
#  [0.31079013 0.54218564 0.12210727 0.29568336]
#  [0.86252657 0.15201418 0.43072984 0.09584376]
#  [0.99046536 0.57384598 0.44314855 0.50062777]]


#给正太分布的随机数条件赋值
data[names=='joe']=7
print(data)
#
# [[0.3180116  0.13789919 0.57195362 0.29129141]
#  [7.         7.         7.         7.        ]
#  [0.76172475 0.21645219 0.50425208 0.69248336]
#  [0.99019745 0.9510665  0.53139824 0.39900776]
#  [0.95121219 0.27315496 0.68358304 0.52597268]
#  [7.         7.         7.         7.        ]
#  [7.         7.         7.         7.        ]]






'''
花式索引

利用整数的数组进行索引
'''
arr=np.empty((8,4))
for i in range(8):
    arr[i]=i
print(arr)
# [[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.]]





#获取第5行,第三行,第一行,第七行 arr[[]]
print(arr[[4,3,0,6]])
# [[4. 4. 4. 4.]
#  [3. 3. 3. 3.]
#  [0. 0. 0. 0.]
#  [6. 6. 6. 6.]]


#获取第一行和最后一行
print(arr[[-7,-1]])
# [[1. 1. 1. 1.]
#  [7. 7. 7. 7.]]

#重组矩阵
data=np.arange(32).reshape((8,4))
print(data)
# [[ 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]]


print(data[[1,5,7,2]])
# [[ 4  5  6  7]
#  [20 21 22 23]
#  [28 29 30 31]
#  [ 8  9 10 11]]

print(data[[1,5,7,2],[3,2,1,0]])#[ 7 22 29  8]  获取的(1,3);(5,2);(7,1);(2,0)的数据

#获取行数据
print(data[[1,5,7,2]][:,[3,2,1,0]])
# [[ 7  6  5  4]
#  [23 22 21 20]
#  [31 30 29 28]
#  [11 10  9  8]]




'''
矩阵的转置和轴对称
'''
data=np.arange(15).reshape((3,5))
print(data)
# [[ 0  1  2  3  4]
#  [ 5  6  7  8  9]
#  [10 11 12 13 14]]

#转置  arr.T
data_T=data.T
print(data_T)
# [[ 0  5 10]
#  [ 1  6 11]
#  [ 2  7 12]
#  [ 3  8 13]
#  [ 4  9 14]]

#多维数组的转置
data=np.arange(16).reshape(2,2,4)
print(data)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]]
#
#  [[ 8  9 10 11]
#   [12 13 14 15]]]

print(data.swapaxes(1,2))
# [[[ 0  4]
#   [ 1  5]
#   [ 2  6]
#   [ 3  7]]
#
#  [[ 8 12]
#   [ 9 13]
#   [10 14]
#   [11 15]]]


'''
通用函数
'''

arr = np.arange(10)
arr_sq=np.sqrt(arr)
print(arr_sq)#0到九的平方根
# [0.         1.         1.41421356 1.73205081 2.         2.23606798
#  2.44948974 2.64575131 2.82842712 3.        ]

#e^x  自然数的x方
arr_exp=np.exp(arr)
print(arr_exp)
# [1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+01
#  5.45981500e+01 1.48413159e+02 4.03428793e+02 1.09663316e+03
#  2.98095799e+03 8.10308393e+03]

x=np.random.randn(8)
y=np.random.randn(8)
print(x)
# [ 0.28447634  1.41080785  1.128851    0.78103467  0.13571358 -0.14375638
#  -1.19790873  1.6918698 ]
print(y)
# [-0.26475371  0.77568501 -0.02374226 -0.23221057  1.46470355 -0.79920626
#  -0.37125551  1.45384419]

print(np.maximum(x,y))#获取元素组比较大的值
# [ 0.28447634  1.41080785  1.128851    0.78103467  1.46470355 -0.14375638
#  -0.37125551  1.6918698 ]



'''
将条件逻辑表述为数组运算

'''
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])
#cond为True时,选择xarr,当cond为False时,选择yarr
print(np.where(cond,xarr,yarr))#[1.1 2.2 1.3 1.4 2.5]

#根据where的设置条件赋值
arr=np.random.randn(4,4)
print(arr)
# [[ 0.42744786 -0.20437107 -0.8747506  -0.6353212 ]
#  [ 0.9812888  -0.1808243  -0.25737532 -0.73141064]
#  [-0.11373206 -1.07405382 -0.4166717   0.37265772]
#  [ 1.00973141  0.56554992  0.9458617  -0.09481286]]

#大于0的为2,小于0的-2
arr1=np.where(arr>0,2,-2)
print(arr1)
# [[ 2 -2 -2 -2]
#  [ 2 -2 -2 -2]
#  [-2 -2 -2  2]
#  [ 2  2  2 -2]]
#大于0的为2,小于0的不变
arr2=np.where(arr>0,2,arr)
print(arr2)
# [[ 2.         -0.20437107 -0.8747506  -0.6353212 ]
#  [ 2.         -0.1808243  -0.25737532 -0.73141064]
#  [-0.11373206 -1.07405382 -0.4166717   2.        ]
#  [ 2.          2.          2.         -0.09481286]]


#复杂的逻辑处理
cond2=[]
# result=[]
# n=10
# for i in range(n):
#     if cond[i] and cond2[i]:
#         result.append(0)
#     elif cond[i]:
#         result.append(1)
#     elif cond2[i]:
#         result.append(2)
#     else:
#         result.append(3)

#这个用where计算
#np.where(cond & cond2,0,np.where(cond,1,np.where(cond2,2,3)))

'''
数学和统计方法
mean 算数平均数
std  标准差
var 方差

自由度
在统计学中,自由度(degree of freedom, df)指的是计算某一统计量时,取值不受限制的变量个数。通常df=n-k。其中n为样本数量,
k为被限制的条件数或变量个数,或计算某一统计量时用到其它独立统计量的个数。自由度通常用于抽样分布中。

cumsum 所有元素的累积和
cumprod 所有元素的累积积
'''

#算数平均数
data=np.arange(9).reshape((3,3))
print(data)
# [[0 1 2]
#  [3 4 5]
#  [6 7 8]]

print(np.mean(data))#36/9=4

#累计和
print(data.cumsum(0))
# [[ 0  1  2]
#  [ 3  5  7]
#  [ 9 12 15]]

#累计积
print(data.cumprod(1))
# [[  0   0   0]
#  [  3  12  60]
#  [  6  42 336]]

'''
用于blur类型的数组的方法
'''

arr=np.random.randn(100)
print((arr>0).sum())#True的就计数
#43

#any()的方法  all()方法
bools=np.array([True,False,True])
print(bools.any())#True 是否存在True

print(bools.all())#false 是否都是True

'''
排序
'''

data=np.random.randn(2,3)
print(data)
# [[ 4.15943673e-01 -6.69555355e-04 -2.29676098e+00]
#  [-2.96074407e-01  7.18820563e-01 -2.00999876e+00]]
data.sort()
print(data)
# [[-2.29676098e+00 -6.69555355e-04  4.15943673e-01]
#  [-2.00999876e+00 -2.96074407e-01  7.18820563e-01]]


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

data=np.array(['1','2','3','4','1'])
print(np.unique(data))
#['1' '2' '3' '4']

#成员资格,返回blur类型
print(np.in1d(data,['1','2']))#[ True  True False False  True]
'''
交集 intersc1d
并集 union1d
差集 setdiff1d
'''

猜你喜欢

转载自blog.csdn.net/qq_38788128/article/details/80585401