数据科学库(一)

3 篇文章 0 订阅

numpy和pandas介绍

通常用numpy和pandas来做数据分析,使得计算过程非常快。

numpy常用属性介绍

import numpy as np
array = np.array([[1,2,3],[2,3,4]])
print(array)
print('number of dim:',array.ndim)
print('shape:',array.shape)
print('size:',array.size)

定义numpy生成array的数据类型和表达形式

array定义形式:dtype,如:

import numpy as np
a=np.array([2,23,4],dtype=np.int)
print(a.dtype)

zeros、ones、empty、arange、linspace方法

生成空矩阵:

import numpy as np
a=np.zeros((3,4))
print(a)

输出如下:

[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

也可以定义dtype:

import numpy as np
a=np.zeros((3,4),dtype=np.int)
print(a)

输入如下:

[[0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]]
  • 生成全部为1的矩阵同上,把zeros改成ones
  • 生成接近为空的矩阵,改为empty
  • 生成有序的矩阵(序列),用arange方法(同python中的range):
import numpy as np
a=np.arange(12).reshape((3,4))
print(a)

输出结果如下:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

其中,reshape方法是重新定义矩阵的长和宽

  • 生成线段,用linspace方法:
import numpy as np
a=np.linspace(0.5,10,20).reshape((4,5))
print(a)

输出结果:

[[ 0.5  1.   1.5  2.   2.5]
 [ 3.   3.5  4.   4.5  5. ]
 [ 5.5  6.   6.5  7.   7.5]
 [ 8.   8.5  9.   9.5 10. ]]

numpy的基础运算

基本数据运算

import numpy as np
a=np.array([10,20,30,40])
b=np.arange(4)

c=a-b
d=b**2           #对b中每一个元素平方
e=10*np.sin(a)   #对a中每一个元素作为10*sin(x)的自变量求值

print('c的值为:',c)
print('d的值为:',d)
print('e的值为:',e)

输出结果为:

c的值为: [10 19 28 37]
d的值为: [0 1 4 9]
e的值为: [-5.44021111  9.12945251 -9.88031624  7.4511316 ]

判断矩阵中每个元素的大小

import numpy as np
a=np.arange(4)
print(a)
print(a<3)

输出结果为:

[0 1 2 3]
[ True  True  True False]

矩阵乘法

有两种乘法,元素逐个相乘和矩阵点乘,例如:

import numpy as np
a=np.array([[1,1],[0,1]])
b=np.arange(4).reshape((2,2))
c=a*b
d=np.dot(a,b)
e=a.dot(b)
print('矩阵a和矩阵b元素逐个相乘结果为:\n',c)
print('矩阵a点乘矩阵b结果为:\n',d)
print('矩阵a点乘矩阵b结果为:\n',e)

输出结果为:

矩阵a和矩阵b元素逐个相乘结果为:
 [[0 1]
 [0 3]]
矩阵a点乘矩阵b结果为:
 [[2 4]
 [2 3]]
矩阵a点乘矩阵b结果为:
 [[2 4]
 [2 3]]

矩阵行或列求和

可用sum方法对矩阵中的全部元素求和,例如:

import numpy as np
a=np.arange(8).reshape((2,4))
print(a)
print(np.sum(a))
print(np.min(a))
print(np.max(a))

输出结果如下:

[[0 1 2 3]
 [4 5 6 7]]
28
0
7

但如果对矩阵的行或列进行以上操作,则需要用到axis参数,axis=1为行,axis=0为列。例如:

import numpy as np
a=np.arange(8).reshape((2,4))
print(a)
print(np.sum(a,axis=1))
print(np.min(a,axis=0))
print(np.max(a,axis=1))

输出结果如下:

[[0 1 2 3]
 [4 5 6 7]]
[ 6 22]
[0 1 2 3]
[3 7]

矩阵索引及常用方法

import numpy as np
A=np.arange(2,14).reshape((3,4))

print(A)
print(np.argmin(A)) #最小值索引
print(np.argmax(A)) #最大值索引
print(np.mean(A))   #平均值
print(np.average(A))#平均值
print(np.median(A)) #中位数
print(A.cumsum())   #循环累加
print(np.diff(A))   #每两个数累差
print(A.nonzero())  #找出非零的数
print(np.sqrt(A))   #求A中元素的平方根

输出结果:

[[ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]]
0
11
7.5
7.5
7.5
[ 2  5  9 14 20 27 35 44 54 65 77 90]
[[1 1 1]
 [1 1 1]
 [1 1 1]]
(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
[[1.41421356 1.73205081 2.         2.23606798]
 [2.44948974 2.64575131 2.82842712 3.        ]
 [3.16227766 3.31662479 3.46410162 3.60555128]]

排序

import numpy as np
A=np.arange(14,2,-1).reshape((3,4))
print(A)
print(np.sort(A))

输出结果:

[[14 13 12 11]
 [10  9  8  7]
 [ 6  5  4  3]]
[[11 12 13 14]
 [ 7  8  9 10]
 [ 3  4  5  6]]

默认逐行排序,可改为sort(A,axis=0)进行逐列排序。

矩阵转置

import numpy as np
A=np.arange(14,2,-1).reshape((3,4))
print(A)
#print(np.transpose(A))
print(A.T)

输出结果:

[[14 13 12 11]
 [10  9  8  7]
 [ 6  5  4  3]]
[[14 10  6]
 [13  9  5]
 [12  8  4]
 [11  7  3]]

clip

截取矩阵的某一区段,大于和小于的部分取为设定值:

import numpy as np
A=np.arange(14,2,-1).reshape((3,4))
print(A)
print(np.clip(A,5,9))

输出结果为:

[[14 13 12 11]
 [10  9  8  7]
 [ 6  5  4  3]]
[[9 9 9 9]
 [9 9 8 7]
 [6 5 5 5]]

按行或列索引

import numpy as np
A=np.arange(3,15).reshape((3,4))
print(A)
for row in A:
    print(row)
for col in A.T:
    print(col)

输出结果:

[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]
[3 4 5 6]
[ 7  8  9 10]
[11 12 13 14]
[ 3  7 11]
[ 4  8 12]
[ 5  9 13]
[ 6 10 14]

逐个索引

import numpy as np
A=np.arange(3,15).reshape((3,4))
print(A)
print(A.flatten())
for item in A.flat:
    print(item)

输出结果:

[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]
[ 3  4  5  6  7  8  9 10 11 12 13 14]
3
4
5
6
7
8
9
10
11
12
13
14

array合并

  • 上下合并
  • 左右合并
import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])
C = np.vstack((A,B))
D = np.hstack((A,B))
print(A)
print(B)
print('A,B竖直方向合并后为:\n',C)
print('A,B水平方向合并后为:\n',D)

输出结果为:

[1 1 1]
[2 2 2]
A,B竖直方向合并后为:
 [[1 1 1]
 [2 2 2]]
A,B水平方向合并后为:
 [1 1 1 2 2 2]

除了vstack、hstack方法,还可以使用concatenate方法和axis进行合并,如下:

import numpy as np
A = np.array([1,1,1])[:,np.newaxis]
B = np.array([2,2,2])[:,np.newaxis]
C = np.concatenate((A,B,B,A),axis=1)
D = np.concatenate((A,B,B,A),axis=0)
print(C)
print(D)

输出结果如下:

[[1 2 2 1]
 [1 2 2 1]
 [1 2 2 1]]
[[1]
 [1]
 [1]
 [2]
 [2]
 [2]
 [2]
 [2]
 [2]
 [1]
 [1]
 [1]]

一维序列(向量)的转置(newaxis方法)

一位序列不能用transpose来进行转置,可以使用newaxis方法,将原来含有n个元素的一维向量,加一个维度编程1xn或者nx1的二维矩阵,如下:

A = np.array([1,1,1])
print(A)
print(A[:,np.newaxis])
print(A[np.newaxis,:])

输出结果如下:

[1 1 1]
[[1]
 [1]
 [1]]
[[1 1 1]]

array分割(split和vsplit、hsplit)

等量分割(split和axis)

import numpy as np
A = np.arange(12).reshape((3,4))
print(A)
print(np.split(A,2,axis=1))
print(np.split(A,3,axis=0))

结果如下:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]

等量分割(vsplit、hsplit)

import numpy as np
A = np.arange(12).reshape((3,4))
print(A)
print(np.hsplit(A,2))
print(np.vsplit(A,3))

结果同上。

不等量分割

以上方法只能对矩阵在横向或者纵向等量分割,但是有时有需要对矩阵进行不等量分割,采用以下方法:

import numpy as np
A = np.arange(12).reshape((3,4))
print(A)
print(np.array_split(A,3,axis=1))

输出结果如下:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2],
       [ 6],
       [10]]), array([[ 3],
       [ 7],
       [11]])]

numpy的copy&deep copy

copy

将一个变量赋值给另一个变量,此时,两个变量完全相同,一个变量中的值改变,另一个也会改变。

import numpy as np
a = np.arange(4)
b = a
c = a
d = b
print(b is a)
print(c is a)
print(d is a)

结果如下:

True
True
True

deep copy

import numpy as np
a = np.arange(4)
b = a.copy()  #deep copy
a[3]=5
print(a)
print(b)
print(b is a)

输出结果如下:

[0 1 2 5]
[0 1 2 3]
False

此时被拷贝的变量改变不会影响被赋值变量的结果。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值