Numpy学习笔记(二):数组的相关操作

Numpy学习笔记

  • 一、数组的创建
    • 1.结构数组的创建(类似于C语言中的结构体)
      • 1)利用字典定义结构
      • 2)利用包含多个元组的列表来定义结构
  • 二、数组的索引、切片与迭代
    • 1.数组的切片索引
    • 2.dots 索引
    • 3.布尔索引
    • 4.数组迭代
  • 三、数组操作
    • 1.更改形状(略)
    • 2.数组转置(略)
    • 3.更改维度
    • 4.数组组合(略)
    • 5.数据拆分(略)
  • 小结

一、数组的创建

1.结构数组的创建(类似于C语言中的结构体)

结构数组,首先需要定义结构,然后利用np.array()来创建数组,其参数dtype为定义的结构。

1)利用字典定义结构

import numpy as np

personType = np.dtype({
    'names': ['name', 'age', 'weight'],
    'formats': ['U30', 'i8', 'f8']})

a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],
             dtype=personType)
print(a, type(a))
# [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]
# 
print(a['name'])
#['Liming' 'Mike' 'Jan']

2)利用包含多个元组的列表来定义结构

import numpy as np

personType = np.dtype([('name', 'U30'), ('age', 'i8'), ('weight', 'f8')])
a = np.array([('Liming', 24, 63.9), ('Mike', 15, 67.), ('Jan', 34, 45.8)],
             dtype=personType)
print(a, type(a))
# [('Liming', 24, 63.9) ('Mike', 15, 67. ) ('Jan', 34, 45.8)]
# 

# 结构数组的取值方式和一般数组差不多,可以通过下标取得元素:
print(a[0])
# ('Liming', 24, 63.9)

print(a[-2:])
# [('Mike', 15, 67. ) ('Jan', 34, 45.8)]

# 我们可以使用字段名作为下标获取对应的值
print(a['name'])
# ['Liming' 'Mike' 'Jan']
print(a['age'])
# [24 15 34]
print(a['weight'])
# [63.9 67.  45.8]

二、数组的索引、切片与迭代

1.数组的切片索引

如果想抽取(或查看)数组的一部分,必须使用切片语法,也就是,把几个用冒号( start:stop:step )隔开的数字置于方括号内。
当了解不明确指明起始和结束位置的情况时,如省去第一个数字,numpy 会认为第一个数字是0;如省去第二个数字,numpy 则会认为第二个数字是数组的最大索引值;如省去最后一个数字,它将会被理解为1,也就是抽取所有元素而不再考虑间隔。

import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])

print(x[::2]) #[1 3 5 7]
print(x[::-1])  # [8 7 6 5 4 3 2 1]
print(x[::-2])  # [8 6 4 2]

对于二维数组,在数组所对应的方括号内存在一逗号,逗号前表示对于行的操作,逗号后表示对于列的操作,如果没有逗号则默认表示对于行的操作。

import numpy as np

x = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 35]])
print(x[1:5:2])
# [[16 17 18 19 20]
#  [26 27 28 29 30]]
print(x[2:])
# [[21 22 23 24 25]
#  [26 27 28 29 30]
#  [31 32 33 34 35]]
print(x[::2, ::3])
# [[11 14]
#  [21 24]
#  [31 34]]

2.dots 索引

NumPy 允许使用…表示足够多的冒号来构建完整的索引列表。

import numpy as np

x = np.random.randint(1, 100, [2, 2, 3])
print(x)
# [[[ 5 64 75]
#   [57 27 31]]
# 
#  [[68 85  3]
#   [93 26 25]]]

print(x[1, ...])
# [[68 85  3]
#  [93 26 25]]

print(x[..., 2])
# [[75 31]
#  [ 3 25]]

3.布尔索引

我们可以通过一个布尔数组来索引目标数组。

import numpy as np

import matplotlib.pyplot as plt

x = np.linspace(0, 2 * np.pi, 50)
y = np.sin(x)
print(len(x))  # 50
plt.plot(x, y)

mask = y >= 0
print(len(x[mask]))  # 25
print(mask)
'''
[ True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True False False False False False False False False False False False
 False False False False False False False False False False False False
 False False]
'''
plt.plot(x[mask], y[mask], 'bo')

mask = np.logical_and(y >= 0, x <= np.pi / 2)
print(mask)
'''
[ True  True  True  True  True  True  True  True  True  True  True  True
  True False False False False False False False False False False False
 False False False False False False False False False False False False
 False False False False False False False False False False False False
 False False]
'''

plt.plot(x[mask], y[mask], 'go')
plt.show()

Numpy学习笔记(二):数组的相关操作_第1张图片

4.数组迭代

除了for循环,Numpy 还提供另外一种更为优雅的遍历方法。

apply_along_axis(func1d, axis, arr)

参数简析:
funcld:计算函数,如加和(np.sum)、求平均值(np.mean)等。
axis:表示坐标轴,在二维数组里有-1、0、1,其中1,-1代表纵方向,0代表横方向。
arr:表示待处理的数组。

import numpy as np

x = np.array([[11, 12, 13, 14, 15],
              [16, 17, 18, 19, 20],
              [21, 22, 23, 24, 25],
              [26, 27, 28, 29, 30],
              [31, 32, 33, 34, 35]])

y = np.apply_along_axis(np.sum, 0, x)
print(y)  # [105 110 115 120 125]
y = np.apply_along_axis(np.sum, 1, x)
print(y)  # [ 65  90 115 140 165]

三、数组操作

1.更改形状(略)

numpy.ndarray.shape 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即 ndim 属性(秩)。我们可以通过修改shape来改变数组的形状。
numpy.reshape(a, newshape[, order=‘C’]) 在不更改数据的情况下为数组赋予新的形状。当参数newshape = -1时,表示将数组降为一维。

2.数组转置(略)

numpy.transpose(a, axes=None) 可以进行数组的专职

3.更改维度

当创建一个数组之后,还可以给它增加一个维度,这在矩阵计算中经常会用到。

import numpy as np

x = np.array([1, 2, 9, 4, 5, 6, 7, 8])
print(x.shape)  # (8,)
print(x)  # [1 2 9 4 5 6 7 8]

y = x[np.newaxis, :]
print(y.shape)  # (1, 8)
print(y)  # [[1 2 9 4 5 6 7 8]]

y = y[np.newaxis, :]
print(y.shape)  # (1, 1, 8)
print(y)  # [[[1 2 9 4 5 6 7 8]]]

y = x[:, np.newaxis]
print(y.shape)  # (8, 1)
print(y)
# [[1]
#  [2]
#  [9]
#  [4]
#  [5]
#  [6]
#  [7]
#  [8]]

numpy.squeeze(a, axis=None) 从数组的形状中删除单维度条目,即把shape中为1的维度去掉。
a表示输入的数组;
axis用于指定需要删除的维度,但是指定的维度必须为单维度,否则将会报错;

import numpy as np

x = np.arange(10)
print(x,x.shape)  # [0 1 2 3 4 5 6 7 8 9] (10,)
x = x[np.newaxis, :]
print(x,x.shape)  # [[0 1 2 3 4 5 6 7 8 9]] (1, 10)
y = np.squeeze(x)
print(y,y.shape)  # [0 1 2 3 4 5 6 7 8 9] (10,)

4.数组组合(略)

numpy.concatenate((a1, a2, …), axis=0, out=None) 提供了将多个数组拼接到一起的功能
***numpy.vstack(tup)*表示竖直(列)的拼接方式
numpy.hstack(tup)表示水平(行)的拼接方式
上述两种拼接方式在
数据维度等于1
时,比较特殊。而当维度大于或等于2时,它们的作用
相当于concatenate
,用于在已有轴上进行操作。

5.数据拆分(略)

numpy.split(ary, indices_or_sections, axis=0) 提供将一个数组拆分为多个数组的功能,其中indices_or_sections 参数是返回数组的形状
numpy.vsplit(ary, indices_or_sections) 表示竖直(列)的拆分方式
numpy.hsplit(ary, indices_or_sections) 表示水平(行)的拆分方式

小结

以上便是本人在学习Numpy数组过程中总结的所有陌生的知识点,对于其中略写的部分,有些是因为在前期的实践中已经可以达到熟用的程度,有些是尚未接触到需要使用的领域的知识,如果在今后的研究中需要使用,我也一定会返回来将略写部分的知识进行详细的扩充与代码说明。
如果您在阅读过程中发现了本文的不足或者错误,请您在下方留言以批评指正,本人一定及时修改。感谢您阅读本文!

你可能感兴趣的:(Numpy学习笔记,numpy,学习,python)