python机器学习之九 numpy库之数组(数组的索引、切片;多维数组的基本操作)

本篇主要介绍numpy中的数组操作:

  1. 数组的索引、切片
  2. 多维数组的基本操作

 

1.数组的索引、切片

数组索引、切片主要有以下三个特点:

①数组索引从0开始

②可以反向索引

③可以对每一个维度都可以进行切片

'''数组下标从0开始,指的任意维度,下标都从0开始'''
a = np.array([[1, 2], [5, 6]])
a
'''
array([[1, 2],
       [5, 6]])
'''
print(a[0,0] ) # 访问a数组第0行第0列元素 1

a[0,0] =2 #修改a数组第0行第0列元素值为2
a
'''
array([[2, 2],
       [5, 6]])
'''

'''数组下标支持反向索引,指任意维度最后元素-1,依次反向索引'''
print(a[0,-1]) # 访问a数组第0行第-1(即正向索引第1列)元素 2

'''数组切片 数组切片方式与列表相同,即在某一维度上进行切片'''
# 正态生成4行5列的二维数组
arr = np.random.normal(1.75, 0.1, (4, 5))
print(arr)
'''
[[1.79298767 1.91415977 1.53111211 1.78351471 1.77301072]
 [1.64799994 1.96470888 1.74782748 1.75591085 1.65585861]
 [1.83204328 1.79612227 1.73520328 1.85348431 1.7278858 ]
 [1.90285654 1.85058937 1.62209023 1.5908711  1.71462305]]
'''
# 截取第1至2行的第2至3列(从第0行算起)缺省默认全部留下
after_arr = arr[1:3, 2:4]
print(after_arr)
'''
[[1.74782748 1.75591085]
 [1.73520328 1.85348431]]
'''
#截取第2列至第3列的所有行
after_arr = arr[:, 2:4]
'''
array([[1.53111211, 1.78351471],
       [1.74782748, 1.75591085],
       [1.73520328, 1.85348431],
       [1.62209023, 1.5908711 ]])
'''
#截取第1行至第三行的所有列
after_arr = arr[1:3, ]
'''
array([[1.64799994, 1.96470888, 1.74782748, 1.75591085, 1.65585861],
       [1.83204328, 1.79612227, 1.73520328, 1.85348431, 1.7278858 ]])
'''

#通过数组切片修改数组元素
a = np.array([[1, 2], [5, 6]])
a[0,:]=[1,1] # a 第0行修改为 [1,1]
a
'''
array([[1, 1],
       [5, 6]])
'''

a = np.array([[1, 2], [5, 6]])
a[:,1]=[2,2] # a 第1列修改为 [1,1]
a
'''
array([[1, 2],
       [5, 2]])
'''   

2.多维数组的基本操作

将会介绍以下基本操作:

1.数组的数学运算(操作不同类型的多维数组时,结果自动转换为精度更高类型的数组):+、-、 /、 ** 、二元运算符、 * :元素点乘、矩阵乘法 dot

+、-、/、** :这几类操作是对数组中的元素进行直接的加、减、除、求幂操作,支持对整个数组或者部分数组元素进行操作

二元运算符:也是对数组中的元素进行直接的+=、-=、/=操作,并将结果赋值回原数组,支持对整个数组或部分数组元素进行操作

如:

 # 创建数组
a = np.array([[1, 2], [5, 6]])
'''
array([[1, 2],
       [5, 6]])
'''
a+3 #对数组a中的所有元素进行+3操作
'''
array([[4, 5],
       [8, 9]])
'''

a[0,0]+3 #对数组a的第0行第0列进行+3操作
'''
4
'''

a*3 #对数组a中的所有元素进行*3操作
'''
array([[ 3,  6],
       [15, 18]])
'''

a/3 #对数组a中的所有元素进行/3操作

'''
array([[0.33333333, 0.66666667],
       [1.66666667, 2.        ]])
'''

a
'''
array([[1, 2],
       [5, 6]])
'''
a ** 2 #对数组a中的所有元素进行求幂操作
'''
array([[ 1,  4],
       [25, 36]], dtype=int32)
'''

#二元运算符
a = np.array([[1, 2], [5, 6]])a+=3
a
'''
array([[4, 5],
       [8, 9]])
'''
a[1,1]+=1
a
'''
array([[ 4,  5],
       [ 8, 10]])
'''

元素点乘:*

# 创建数组
a = np.array([[1, 2], [5, 6]])
# 多维数组
b = np.array([[1, 2], [5, 6]])
print(a)
'''
[[1 2]
 [5 6]]
'''
print(b)
'''
[[1 2]
 [5 6]]
'''
c = a * b #数组a与数组b进行元素点乘
print(c)
'''
[[ 1  4]
 [25 36]]
'''

#进行点乘的数组,维数信息需要可以进行元素内积,否则提示错误信息
b = np.array([[1, 2,1], [5, 6,7]])
a*b
'''
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2,2) (2,3)
'''

矩阵乘法 dot:

numpy官方文档上所写:
如果 a 和 b都是 1-D arrays,它的作用是计算内积。(不进行复共轭)

np.dot(3, 4) # 12
np.dot([2, 3], [2, 3]) # 13

如果 a 和 b 是 2-D arrays, 作用是矩阵的乘积, a 和 b的维数要满足矩阵乘积维数要求,此时推荐使用 a @ b 。

a = [[1, 0], [0, 1]
b = [[4, 1], [2, 2]]
np.dot(a, b)
'''
array([[4, 1],
       [2, 2]])
'''

如果 a 或 b 是 0-D (标量), 等价于数组点乘,推荐使用 numpy.multiply(a, b)或 a * b。

np.dot(2,3) # 6

如果 a 是 N-D array 且 b 是 1-D array, 作用是在a 和 b的最后一个轴上进行sum product运算。
 

a = np.array([[[ 1.,  2.,  3.,  4.],
          [ 5.,  6.,  7.,  8.],
          [ 9., 10., 11., 12.]],

         [[ 1.,  2.,  3.,  4.],
          [ 5.,  6.,  7.,  8.],
          [ 9., 10., 11., 12.]]])
b = np.array([1,2,3,4])
np.dot(a, b)
'''
array([[ 30.,  70., 110.],
       [ 30.,  70., 110.]])
'''
# 创建数组
a = np.array([[1, 2], [5, 6]])
# 多维数组
b = np.array([[1, 2], [5, 6]])
print(a)
'''
[[1 2]
 [5 6]]
'''
print(b)
'''
[[1 2]
 [5 6]]
'''
d = np.dot(a, b) #数组a与数组b进行矩阵乘法,最后的结果存入d中
print(d)
'''
array([[11, 14],
       [35, 46]])
'''

2.转置

使用 numpy的transpose方法,完成数组转置

语法格式:numpy.transpose(array)

#一维数组转置
arr = np.arange(6)
print(arr)
'''
[0, 1, 2, 3, 4, 5]
'''
print(np.transpose(arr))
'''
[0, 1, 2, 3, 4, 5]#一维还是一维…
'''
#二维数组转置
arr = np.arange(6).reshape((2,3))
print(arr)
'''
[[0, 1, 2],
 [3, 4, 5]]
'''
print(np.transpose(arr))
'''
[[0,3],
 [1,4],
 [3,5]]
'''

3.条件运算

对数组中的元素进行条件运算,输出元素相应的bool数组,可以用于筛选数组元素,对指定范围数组元素进行修改等。

如:将数组中大于0.5的值置为0

arr = np.random.rand(5,5) # 5x5的随机数组
arr
'''
array([[0.10158289, 0.24435586, 0.63083734, 0.97459745, 0.64882868],
       [0.43441076, 0.92342304, 0.05077939, 0.3391776 , 0.50852469],
       [0.08768648, 0.57992711, 0.83834858, 0.97962452, 0.55448346],
       [0.42689988, 0.36140115, 0.77588118, 0.36685161, 0.83965068],
       [0.70111686, 0.18487657, 0.2525437 , 0.86080893, 0.69806511]])
'''
mask = arr>0.5 # 生成数组中元素大于0.5的元素的bool数组
'''
array([[False, False,  True,  True,  True],
       [False,  True, False, False,  True],
       [False,  True,  True,  True,  True],
       [False, False,  True, False,  True],
       [ True, False, False,  True,  True]])
'''
arr[mask] = 0 # 将数组中大于0.5的值设为0
'''
array([[0.10158289, 0.24435586, 0.        , 0.        , 0.        ],
       [0.43441076, 0.        , 0.05077939, 0.3391776 , 0.        ],
       [0.08768648, 0.        , 0.        , 0.        , 0.        ],
       [0.42689988, 0.36140115, 0.        , 0.36685161, 0.        ],
       [0.        , 0.18487657, 0.2525437 , 0.        , 0.        ]])
'''

 

展开阅读全文

没有更多推荐了,返回首页