Numpy教程
NumPy简介
NumPy 是用于处理数组的 python 库。它还拥有在线性代数、傅立叶变换和矩阵领域中工作的函数。
NumPy 指的是数值 Python(Numerical Python)。
在 Python 中,我们有满足数组功能的列表,但是处理起来很慢。
NumPy 旨在提供一个比传统 Python 列表快 50 倍的数组对象。
NumPy 中的数组对象称为 ndarray,它提供了许多支持函数,使得利用 ndarray 非常容易。
NumPy 比列表快:
与列表不同,NumPy 数组存储在内存中的一个连续位置,因此进程可以非常有效地访问和操纵它们。
导入NumPy:
import numpy
arr = numpy.array([1, 2, 3, 4, 5])
print(arr)
在导入时使用 as 关键字创建别名:
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr)
# Return evenly spaced numbers over a specified interval
linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None,
axis=0)
# num : int, optional
# Number of samples to generate. Default is 50. Must be non-negative
数组创建
创建包含值 1、2、3 和 4、5、6 两个数组的 2-D 数组:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
检查维数:NumPy数组提供了ndim属性,该属性返回一个整数,该整数会告诉我们数组有多少维
检查数组有多少维:
import numpy as np
a = np.array(42)
b = np.array([1, 2, 3, 4, 5])
c = np.array([[1, 2, 3], [4, 5, 6]])
d = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])
print(a.ndim)
print(b.ndim)
print(c.ndim)
print(d.ndim)
数组索引:
访问2-D数组:
访问第一维中的第二个元素:
import numpy as np
arr = np.array([[1,2,3,4,5], [6,7,8,9,10]])
print('2nd element on 1st dim: ', arr[0, 1])
数组裁剪
从下面的数组中裁切索引 1 到索引 5 的元素:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7])
print(arr[1:5])
注:结果包括开始索引,但不包括结束索引
裁切数组中索引 4 到结尾的元素:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7])
print(arr[4:])
数组形状
数组的形状是每个维中元素的数量
获取数组的形状:NumPy数组有一个名为shape的属性,该属性返回一个元组,每个索引具有相应元素的数量。
打印 2-D 数组的形状:
import numpy as np
arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(arr.shape) // return (2,4)
数组重塑
重塑意味着更改数组的形状。数组的形状是每个维中元素的数量。
通过重塑,我们可以添加或删除维度或更改每个维度中的元素数量。
将以下具有 12 个元素的 1-D 数组转换为 2-D 数组。
最外面的维度将有 4 个数组,每个数组包含 3 个元素:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
newarr = arr.reshape(4, 3)
print(newarr)
展平数组(Flattening the arrays)是指将多维数组转换为1D数组
将数组转换为1D数组:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
newarr = arr.reshape(-1)
print(newarr)
数组迭代
迭代二维数组的元素:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
for x in arr:
print(x)
迭代 2-D 数组的每个标量元素:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
for x in arr:
for y in x:
print(y)
如果我们迭代一个 n-D 数组,它将逐一遍历第 n-1 维
迭代以下 3-D 数组的元素:
import numpy as np
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
for x in arr:
print(x)
在基本的 for 循环中,迭代遍历数组的每个标量,我们需要使用 n 个 for 循环,对于具有高维数的数组可能很难编写。函数 nditer() 是一个辅助函数,从非常基本的迭代到非常高级的迭代都可以使用。
遍历以下 3-D 数组:
import numpy as np
arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
for x in np.nditer(arr):
print(x)
import numpy as np
x = np.array([[1,2, ], [5,6, ], [9,10, ]])
for index, value in np.ndenumerate(x):
print(index, ":", value)
数组连接
连接意味着将两个或多个数组的内容放在单个数组中
在 SQL 中,我们基于键来连接表,而在 NumPy 中,我们按轴连接数组。
我们传递了一系列要与轴一起连接到 concatenate() 函数的数组。如果未显式传递轴,则将其视为 0
连接两个数组:
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.concatenate((arr1, arr2))
print(arr)
沿着行 (axis=1) 连接两个 2-D 数组:
import numpy as np
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
arr = np.concatenate((arr1, arr2), axis=1)
print(arr)
数组拆分
拆分(Spliting)将一个数组拆分为多个
array_split() 方法的返回值是一个包含每个分割的数组
将数组分为3部分:
import numpy as np
arr = np.array([1,2,3,4,5,6])
newarr = np.array_split(arr,3)
print(newarr)
访问拆分的数组:
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6])
newarr = np.array_split(arr, 3)
print(newarr[0])
print(newarr[1])
print(newarr[2])
数组搜索
where()方法搜索数组
查找值为4的索引:
import numpy as np
arr = np.array([1,2,3,4,5,4,4])
x = np.where(arr == 4)
print(x)
搜索排序:searchsorted()方法在数组中执行二进制搜索,并返回将在其中插入指定值以维持搜索顺序的索引
查找应在其中插入值 7 的索引:
import numpy as np
arr = np.array([6, 7, 8, 9])
x = np.searchsorted(arr, 7)
print(x)
数组排序
NumPy ndarray 对象有一个名为 sort() 的函数,该函数将对指定的数组进行排序
import numpy as np
arr = np.array([3, 2, 0, 1])
print(np.sort(arr))
print(arr) # 原数组保持不变
注:此方法返回数组的副本,而原始数组保持不变
对 2-D 数组排序
import numpy as np
arr = np.array([[3, 2, 4], [5, 0, 1]])
print(np.sort(arr))
数组过滤
过滤(Filitering): 从现有数组中取出一些元素并从中创建新数组
在 NumPy 中,我们使用布尔索引列表来过滤数组。布尔索引列表是与数组中的索引相对应的布尔值列表。
如果索引处的值为 True,则该元素包含在过滤后的数组中;如果索引处的值为 False,则该元素将从过滤后的数组中排除。
用索引 0 和 2、4 上的元素创建一个数组:
import numpy as np
arr = np.array([61, 62, 63, 64, 65])
x = [True, False, True, False, True]
newarr = arr[x]
print(newarr)
创建过滤数组:
创建一个仅返回大于 62 的值的过滤器数组:
import numpy as np
arr = np.array([61, 62, 63, 64, 65])
# 创建一个空列表
filter_arr = []
# 遍历 arr 中的每个元素
for element in arr:
# 如果元素大于 62,则将值设置为 True,否则为 False:
if element > 62:
filter_arr.append(True)
else:
filter_arr.append(False)
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)
直接从数组创建过滤器
创建一个仅返回大于 62 的值的过滤器数组:
import numpy as np
arr = np.array([61, 62, 63, 64, 65])
filter_arr = arr > 62
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)
NumPy随机数
NumPy提供了random模块来处理随机数
生成一个 0 到 100 之间的随机整数:
from numpy import random
x = random.randint(100)
print(x)
生成随机数组:
randint()方法接受size参数,指定数组的形状
生成一个 1-D 数组,其中包含 5 个从 0 到 100 之间的随机整数:
from numpy import random
x=random.randint(100, size=(5))
print(x)
生成有 3 行的 2-D 数组,每行包含 5 个从 0 到 100 之间的随机整数:
from numpy import random
x = random.randint(100, size=(3, 5))
print(x)
从数组生成随机数:
返回数组中的值之一:
from numpy import random
x = random.choice([3, 5, 7, 9])
print(x)
vstack(tup):垂直(按照行顺序)把数组堆叠起来。
参数tup可以是元组,列表,或者numpy数组,返回结果为numpy的数组。