Numpy基础入门

一. Numpy的主要功能

  • 数组的算数和逻辑运算。
  • 傅立叶变换和用于图形操作的例程。
  • 线性代数有关的操作。 NumPy 拥有线性代数和随机数生成的内置函数。

二. Numpy的基本数据结构

Numpy提供的核心功能是数组,所以它的最基本的数据结构就是多维数组结构Ndarray。Ndarray无论是运算速度,还是功能函数都比list结构要更好。该结构的特点如下:

  1. 数组中所有的元素类型相同。
  2. 每个元素在内存中的块大小相同。
  3. 数组的维度信息存放在shape属性,类型信息存放在dtype属性。

三. Ndarray结构的基本使用

1. 创建Ndarray
  1. 直接使用np.array()创建
    numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
    object参数,接受一切序列型的对象,用于创建数组。
    dtype参数,为数组指定一个类型
    order参数,(C语言风格)按行显示数组='C'; 或者(Fortran语言风格)按列显示数组='F'
    ndmin参数,指定数组的最小维度
# 最小维度  
import numpy as np 
a = np.array([1, 2, 3, 4, 5], ndmin =  2, dtype=np.float)  #本来是一维数组,强行控制它为二维数组
print (a)

Out:
[[1.0, 2.0, 3.0, 4.0, 5.0]]
  1. 固定填充元素创建
    创建空数组:numpy.empty (shape, dtype = float, order = 'C')
    创建全0数组:numpy.zeros (shape, dtype = float, order = 'C')
    创建全1数组:numpy.ones (shape, dtype = None, order = 'C')

shape参数,整数表示一维数组的长度,元组表示多维数组的形状。

  1. 从已有数据中创建
    从其他序列创建 numpy.asarray(object, dtype = None, order = None)
    该函数类似于np.array(),主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会。
    从迭代器创建 numpy.fromiter(iterable, dtype, count = -1)
    count参数,读取的数据量,-1表示所有数据

  2. 给定范围生成数组

  • 按步长 numpy.arange(start, stop, step, dtype)

    Numpy基础入门_第1张图片

  • 按间隔数量 numpy.linspace(start, stop, num, endpoint, retstep, dtype)

    Numpy基础入门_第2张图片

2. Ndarray的常用属性
  • ndarray.shape 数组维度
  • ndarray.dtype 数组类型
  • ndarray.ndim 数组最小维度
  • ndarray.itemsize 数组每个元素的字节长度
3. Ndarray的切片与索引
  1. 下标索引:同Python,下标从0开始。
  2. 切片:与Python相同,Ndarray的切片依旧使用 [开始下标:终止下标(不包含):步长]的格式。
    可以使用省略号...,表示某个维度的所有元素
arr=np.asarray([[1,2,3,4],[5,6,7,8]])
print(arr)
print(arr[...,1])# 打印第2列所有元素

Out:
[[1 2 3 4]
 [5 6 7 8]]

[2 6]

注意:Numpy切片与Python序列切片最大的不同在于,ndarray切片返回值是原数组的视图,修改切片会影响原数组;而Python序列的切片返回值是副本,与原序列没关系。如果需要ndarray的切片副本,需要显示复制a=arr[2:5].copy()

4. Ndarray的高级索引
  1. 整数索引
    以前访问多维数组的时候,我们使用多个中括号来表达不同的轴,比如下图。这种方式一次只能访问一个元素。
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[1][0])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

6

如果我们使用的中括号的数量小于数组的维度,那么更高级的轴将被全选,比如下图。

arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[1])

out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[6 7 8]

但是对于更高级的轴,我们不想全选,只想选取若干个怎么办?这时Ndarray的特点就显现了。他可以对每个轴都进行选择,用逗号隔开每个轴之间的下标,按顺序构成坐标对,举个例子,下图中,第一个中括号表示对第一个轴的选取,第二个中括号是对第二个轴的选取,两个轴按顺序构成坐标对(0,1),(1,2),得到这2个位置的数据

arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[ [0,1],[1,2] ])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[3 8]

上面是按照坐标对来选择的,如果想选择某块数据怎么办?我们可以按轴切片,轴切片之间用逗号隔开,举个例子。

arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[:2,1:])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[[3 4]
 [7 8]]

敲黑板,总结 一下整数索引:

  • 老旧方法:1. 使用与维度数目一样的中括号来访问单个元素;2. 使用少于维度数目的中括号访问一片高维度数据。
  • Ndarray独有方法:在中括号内对所有轴做选择,不同轴用逗号隔开arr[轴1,轴2,轴3],枚举下标要用中括号包裹起来,切片不用包裹,二者可以混用。举个栗子:
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[ [0,1],1: ])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[[3 4]
 [7 8]]
  1. 布尔索引
    之前我们在某个维度选取元素的时候,使用的都是整数下标,其实可以不用下标的,而是用布尔数组,但是要求布尔数组和这个维度的长度一致。举个例子,假设我们要选择第二行所有数据:
arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[ [False,True,False] ])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[[6 7 8]]

或者选择第二行,第二列和第三列的数据。方法和整数索引一样,不同的是,这次用布尔数组。

arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print (arr)
print(arr[[False,True,False],[False,True,True]])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[7 8]

其实Ndarray做逻辑运算的时候,会返回一个布尔数组,我们可以利用这一点,直接进行数据选择:

arr=np.array([[2,3,4],[6,7,8],[1,1,1]])
print(arr)
print (arr>2)
print(arr[arr>2])

Out:
[[2 3 4]
 [6 7 8]
 [1 1 1]]

[[False  True  True]
 [ True  True  True]
 [False False False]]

[3 4 6 7 8]

最后强调一点,布尔数组必须和筛选维度的长度一致!!!!

你可能感兴趣的:(Numpy基础入门)