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的数组。

posted @ 2021-10-17 22:10  Vinta  阅读(82)  评论(0编辑  收藏  举报