Python numpy数据结构 学习笔记

一、概念介绍

numpy是Python的一个扩充程序库,支持高阶大量的维度数组矩阵运算,此外也针对数组运算提供大量的数学函数

对于数据的运算,用矩阵会比python自带的字典或者列表快好多

主要应用有:

  • 数据分析
  • 机器学习
  • 深度学习


二、安装

请看: MAC/Windows/Linux环境numpy和pandas安装


三、numpy基本属性

1. 数组和矩阵运算:

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

print(a) #[10 20 30 40]
print(b) #[0 1 2 3]

c = a+b
print(c) #[10 21 32 43]

c = a-b
print(c) #[10 19 28 37]

c = a*b
print(c) #[  0  20  60 120]

c = b/a
print(c) #[0.         0.05       0.06666667 0.075     ]

c= 10*np.sin(a)
print(c) #[-5.44021111  9.12945251 -9.88031624  7.4511316 ]

c= np.cos(a)
print(c) #[-0.83907153  0.40808206  0.15425145 -0.66693806]

c= np.tan(a)
print(c) #[ 0.64836083  2.23716094 -6.4053312  -1.11721493]


c= b**2
print(c) #[0 1 4 9]

print(b) #[0 1 2 3]
print(b<3) #[ True  True  True False]
print(b==3) #[False False False  True]


a = np.array([[1,1],
              [0,1]])
b = np.arange(4).reshape(2,2) #2行2列的矩阵

print(a)
#[[1 1]
# [0 1]]

print(b)
#[[0 1]
# [2 3]]

c = a*b
print(c) #矩阵乘法:1.对应元素相乘
# [[0 1]
#  [0 3]]

c_dot = np.dot(a,b) #矩阵乘法:2.标准的矩阵乘法运算,即对应行乘对应列得到相应元素
print(c_dot)
#[[2 4]
# [2 3]]

#另外的一种关于dot的表示方法:
c_dot_2 = a.dot(b)
print(c_dot_2)


d= np.random.random((2,4)) #从0到1的随机数
#[[0.85495172 0.9741222  0.41543361 0.33450706]
# [0.58007087 0.43367435 0.72388887 0.16034378]]
print(d)

print(np.sum(d))
#4.476992464110268

print(np.sum(d,axis=1)) #each line,当axis的值为1的时候,将会以行作为查找单元
#[2.57901459 1.89797787]


print(np.min(d)) #0.16034377580836667

print(np.min(d,axis=0))#each column,当axis的值为0的时候,将会以列作为查找单元
#[0.58007087 0.43367435 0.41543361 0.16034378]


print(np.max(d))
#0.9741222029914546

代码连接:https://github.com/ziqiiii/Python_learning/blob/master/numpy1.py


2. 数组及矩阵的基本运算:


import numpy as np

a=np.arange(2,14).reshape((3,4))
print(a)
#[[ 2  3  4  5]
# [ 6  7  8  9]
# [10 11 12 13]]

print(np.argmin(a))#0,求矩阵中最小元素的索引
print(np.argmax(a))#11,求矩阵中最大元素的索引

print(np.mean(a))#计算统计中的均值,7.5
print(a.mean())

print(np.average(a))#计算统计中的均值,7.5

print(np.median(a))#求解中位数, 7.5


print(np.cumsum(a)) #累加函数,生成的每一项矩阵元素均是从原矩阵首项累加到对应项的元素之和。
#[ 2  5  9 14 20 27 35 44 54 65 77 90]


print(np.diff(a))#有累差运算函数:该函数计算的便是每一行中后一项与前一项之差。
#故一个3行4列矩阵通过函数计算得到的矩阵便是3行3列的矩阵。
'''
[[1 1 1]
 [1 1 1]
 [1 1 1]]
'''

print(np.nonzero(a)) #这个函数将所有非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵。
#(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2]), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]))

b=np.arange(14,2,-1).reshape(3,4)
print(b)
'''
[[14 13 12 11]
 [10  9  8  7]
 [ 6  5  4  3]]
'''

print(np.sort(b)) #排序函数仅针对每一行进行从小到大排序操作
'''
[[11 12 13 14]
 [ 7  8  9 10]
 [ 3  4  5  6]]
'''

#矩阵的转置有两种表示方法
print(np.transpose(b))
print(b.T)
'''
[[14 10  6]
 [13  9  5]
 [12  8  4]
 [11  7  3]]
'''


print((b.T).dot(b))
'''转置后矩阵相乘:
[[332 302 272 242]
 [302 275 248 221]
 [272 248 224 200]
 [242 221 200 179]]
'''

print(b)
'''
[[14 13 12 11]
 [10  9  8  7]
 [ 6  5  4  3]]
'''
print(np.clip(b,5,9))
'''这个函数的格式是clip(Array,Array_min,Array_max),
Array指的是将要被执行用的矩阵,而后面的最小值最大值则用于让函数
判断矩阵中元素是否有比最小值小的或者比最大值大的元素,
并将这些指定的元素转换为最小值或者最大值。

eg:
[[9 9 9 9]
 [9 9 8 7]
 [6 5 5 5]]
'''


print(b)
'''
[[14 13 12 11]
 [10  9  8  7]
 [ 6  5  4  3]]
'''
print(np.mean(b,axis=1)) #line
#[12.5  8.5  4.5]

print(np.mean(b,axis=0))#column
#[10.  9.  8.  7.]

代码连接:https://github.com/ziqiiii/Python_learning/blob/master/numpy2.py

3. 索引

import numpy as np

A = np.arange(3,15)

print(A) # [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
print(A[3]) # 6

A = np.arange(3,15).reshape(3,4)

print(A)
'''
[[ 3,  4,  5,  6]
 [ 7,  8,  9, 10]
 [11, 12, 13, 14]]
'''
print(A[2]) # [11, 12, 13, 14]
print(A[2][1]) # 12
print(A[2,1]) # 12
print(A[2,:]) # [11, 12, 13, 14]
print(A[:,1]) # [ 4  8 12] 
print(A[1,2:3]) #  [9]
print(A[1,1:3]) # [8 9]

for row in A:
    print(row)
'''
 [3 4 5 6]
 [ 7  8  9 10]
 [11 12 13 14]
'''


for column in A:
    print(column)
'''
[3 4 5 6]
[ 7  8  9 10]
[11 12 13 14]
'''


print(A.T)
'''
[[ 3  7 11]
 [ 4  8 12]
 [ 5  9 13]
 [ 6 10 14]]
'''
for column in A.T:
    print(column)
'''
 [ 3  7 11]
 [ 4  8 12]
 [ 5  9 13]
 [ 6 10 14]
'''

#flatten是一个展开性质的函数,将多维的矩阵进行展开成1行的数列
print(A.flatten())  # [ 3  4  5  6  7  8  9 10 11 12 13 14]

#flat是一个迭代器,本身是一个object属性
for item in A.flat:
    print(item)
'''
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
'''

代码链接: https://github.com/ziqiiii/Python_learning/blob/master/numpy3.py


4.矩阵/数组的合并

import numpy as np

A=np.array([1,1,1])
B=np.array([2,2,2])

C=np.vstack((A,B)) #vertical stack
D=np.hstack((A,B)) #horizontal stack

print(C)
'''
[[1 1 1]
 [2 2 2]]
'''
print(D) # [1 1 1 2 2 2]
print(A.shape,C.shape) # ((3,), (2, 3))
print(A.shape,D.shape) # ((3,), (6,))

print(A.T) #[1 1 1]
print(A.T.shape) #(3,)

print(A.size) #3
print(A[:,np.newaxis]) # 转置操作
'''
[[1]
 [1]
 [1]]
'''
print(A.reshape(A.size,1))
'''
[[1]
 [1]
 [1]]
'''

#--------------------------------------------------
print('---------------------')
A=np.array([1,1,1])[:,np.newaxis]
B=np.array([2,2,2])[:,np.newaxis]

C=np.vstack((A,B)) #vertical stack
D=np.hstack((A,B)) #horizontal stack

print(C)
'''
[[1]
 [1]
 [1]
 [2]
 [2]
 [2]]
'''
print(D) #
'''
[[1 2]
 [1 2]
 [1 2]]
'''
print(A.shape,C.shape) # (3, 1) (6, 1)
print(A.shape,D.shape) # (3, 1) (3, 2)


#--------------------------------------------------
print('---------------------')
C = np.concatenate((A,B,B,A),axis=0) #合并操作需要针对多个矩阵或序列
#axis参数很好的控制了矩阵的纵向或是横向打印
print(C)
"""
[[1]
 [1]
 [1]
 [2]
 [2]
 [2]
 [2]
 [2]
 [2]
 [1]
 [1]
 [1]]
"""

D = np.concatenate((A,B,B,A),axis=1)

print(D)
"""
[[1 2 2 1]
 [1 2 2 1]
 [1 2 2 1]]
"""


5. 矩阵分割

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]]
"""

#纵向分割
print(np.split(A, 2, axis=1))
"""
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]
"""

#横向分割
print(np.split(A, 3, axis=0))
# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]


#错误的分割: 范例的Array只有4列,只能等量对分,因此输入以上程序代码后Python就会报错。
#print(np.split(A, 3, axis=1))
# ValueError: array split does not result in an equal division


#不等量的分割
print(np.array_split(A, 3, axis=1))
"""
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2],
        [ 6],
        [10]]), array([[ 3],
        [ 7],
        [11]])]
"""


#其他的分割方式

print(np.vsplit(A, 3)) #等于 print(np.split(A, 3, axis=0))
# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]


print(np.hsplit(A, 2)) #等于 print(np.split(A, 2, axis=1))
"""
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]
"""

6、copy & deep copy

import numpy as np

a = np.arange(4)
# array([0, 1, 2, 3])
b = a
c = a
d = b
print(a) #[0, 1, 2, 3]

a[0] = 11
print(a)
# array([11,  1,  2,  3])

print(b) #[11,  1,  2,  3]


d[1:3] = [22, 33]   # array([11, 22, 33,  3])
print(a)            # array([11, 22, 33,  3])
print(b)            # array([11, 22, 33,  3])
print(c)            # array([11, 22, 33,  3])


print(b is a)  # True
print(c is a)  # True
print(d is a)  # True


#--------------------------------------
print('-------------------------------')

b = a.copy()    # deep copy
print(b)        # array([11, 22, 33,  3])
a[3] = 44
print(a)        # array([11, 22, 33, 44])
print(b)        # array([11, 22, 33,  3])






猜你喜欢

转载自blog.csdn.net/qq_20417499/article/details/80521477