【NumPy 数组过滤、NumPy 中的随机数、NumPy ufuncs】

简介: 【NumPy 数组过滤、NumPy 中的随机数、NumPy ufuncs】

NumPy 数组过滤

从现有数组中取出一些元素并从中创建新数组称为过滤(filtering)。

在 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)

上例将返回 [61, 63, 65],为什么?

因为新过滤器仅包含过滤器数组有值 True 的值,所以在这种情况下,索引为 0 和 2、4。

创建过滤器数组

在上例中,我们对 True 和 False 值进行了硬编码,但通常的用途是根据条件创建过滤器数组。

实例

创建一个仅返回大于 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)

实例

创建一个过滤器数组,该数组仅返回原始数组中的偶数元素:

import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7])
# 创建一个空列表
filter_arr = []
# 遍历 arr 中的每个元素
for element in arr:
  # 如果元素可以被 2 整除,则将值设置为 True,否则设置为 False
  if element % 2 == 0:
    filter_arr.append(True)
  else:
    filter_arr.append(False)
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)

直接从数组创建过滤器

上例是 NumPy 中非常常见的任务,NumPy 提供了解决该问题的好方法。

我们可以在条件中直接替换数组而不是 iterable 变量,它会如我们期望地那样工作。

实例

创建一个仅返回大于 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)

实例

创建一个过滤器数组,该数组仅返回原始数组中的偶数元素:

import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7])
filter_arr = arr % 2 == 0
newarr = arr[filter_arr]
print(filter_arr)
print(newarr)

NumPy 中的随机数

什么是随机数?

随机数并不意味着每次都有不同的数字。随机意味着无法在逻辑上预测的事物。

伪随机和真随机

计算机在程序上工作,程序是权威的指令集。因此,这意味着必须有某种算法来生成随机数。


如果存在生成随机数的程序,则可以预测它,因此它就不是真正的随机数。


通过生成算法生成的随机数称为伪随机数。


我们可以生成真正的随机数吗?


是的。为了在我们的计算机上生成一个真正的随机数,我们需要从某个外部来源获取随机数据。外部来源通常是我们的击键、鼠标移动、网络数据等。


我们不需要真正的随机数,除非它与安全性(例如加密密钥)有关或应用的基础是随机性(例如数字轮盘赌轮)。


在本教程中,我们将使用伪随机数。

生成随机数

NumPy 提供了 random 模块来处理随机数。

实例

生成一个 0 到 100 之间的随机整数:

from numpy import random
x = random.randint(100)
print(x)

生成随机浮点

random 模块的 rand() 方法返回 0 到 1 之间的随机浮点数。

实例

生成一个 0 到 100 之间的随机浮点数:

from numpy import random
x = random.rand()
print(x)

生成随机数组

在 NumPy 中,我们可以使用上例中的两种方法来创建随机数组。

整数

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)

浮点数

rand() 方法还允许您指定数组的形状。

实例

生成包含 5 个随机浮点数的 1-D 数组:

from numpy import random
x = random.rand(5)
print(x)

实例

生成有 3 行的 2-D 数组,每行包含 5 个随机数:

from numpy import random
x = random.rand(3, 5)
print(x)

从数组生成随机数

choice() 方法使您可以基于值数组生成随机值。

choice() 方法将数组作为参数,并随机返回其中一个值。

实例

返回数组中的值之一:

from numpy import random
x = random.choice([3, 5, 7, 9])
print(x)

choice() 方法还允许您返回一个值数组。

请添加一个 size 参数以指定数组的形状。

实例

生成由数组参数(3、5、7 和 9)中的值组成的二维数组:

from numpy import random
x = random.choice([3, 5, 7, 9], size=(3, 5))
print(x)

NumPy ufuncs

什么是 ufuncs?

ufuncs 指的是“通用函数”(Universal Functions),它们是对 ndarray 对象进行操作的 NumPy 函数。

为什么要使用 ufuncs?

ufunc 用于在 NumPy 中实现矢量化,这比迭代元素要快得多。

它们还提供广播和其他方法,例如减少、累加等,它们对计算非常有帮助。

ufuncs 还接受其他参数,比如:

where 布尔值数组或条件,用于定义应在何处进行操作。

dtype 定义元素的返回类型。

out 返回值应被复制到的输出数组。

什么是向量化?

将迭代语句转换为基于向量的操作称为向量化。

由于现代 CPU 已针对此类操作进行了优化,因此速度更快。

对两个列表的元素进行相加:

list 1: [1, 2, 3, 4]

list 2: [4, 5, 6, 7]

一种方法是遍历两个列表,然后对每个元素求和。

实例

如果没有 ufunc,我们可以使用 Python 的内置 zip() 方法:

x = [1, 2, 3, 4]
y = [4, 5, 6, 7]
z = []
for i, j in zip(x, y):
  z.append(i + j)
print(z)

对此,NumPy 有一个 ufunc,名为 add(x, y),它会输出相同的结果。

实例

通过 ufunc,我们可以使用 add() 函数:

import numpy as np
x = [1, 2, 3, 4]
y = [4, 5, 6, 7]
z = np.add(x, y)
print(z)

总结

我们的numpy学习结束。


相关文章
|
2天前
|
计算机视觉 Python
PIL图像转换为Numpy数组:技术与案例详解
本文介绍了如何将PIL图像转换为Numpy数组,以便利用Numpy进行数学运算和向量化操作。首先简要介绍了PIL和Numpy的基本功能,然后详细说明了转换过程,包括导入库、打开图像文件、使用`np.array()`或`np.asarray()`函数进行转换,并通过打印数组形状验证转换结果。最后,通过裁剪、旋转和缩放等案例展示了转换后的应用,以及如何将Numpy数组转换回PIL图像。此外,还介绍了处理base64编码图像的完整流程。
16 4
|
4月前
|
索引 Python
NumPy 教程 之 Numpy 数组操作 28
NumPy 提供多种数组操作功能,包括修改形状、翻转、连接和分割等。本教程重点介绍元素的添加与删除,如使用 `resize`、`append`、`insert` 和 `delete` 函数。其中 `numpy.insert` 可在指定索引前插入值,支持标量或数组插入。示例展示了不同情况下 `insert` 的使用方法,包括不指定轴时的数组扁平化插入,以及沿特定轴进行广播插入。
43 2
|
4月前
|
数据处理 索引 Python
NumPy 数组操作:和普通操作相较,到底蕴含着怎样令人费解的独特魅力?
【8月更文挑战第19天】NumPy是Python科学计算核心库,提供高效数组操作。不同于Python列表直接列举创建,NumPy用`np.array()`创建数组。两者都支持索引和切片,但NumPy性能更优。数学运算方面,NumPy支持简洁的向量化操作,如`my_array * 2`,无需循环。NumPy还简化了数组形状变换,如使用`reshape()`方法。此外,NumPy数组要求元素类型一致,提高了内存使用效率和计算速度。这些特点使NumPy在科学计算和数据分析中不可或缺。
34 0
|
2月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
94 10
|
2月前
|
Python
Numpy学习笔记(四):如何将数组升维、降维和去重
本文介绍了如何使用NumPy库对数组进行升维、降维和去重操作。
55 1
|
2月前
|
Python
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
NumPy库中的`np.concatenate`和`np.append`函数,它们分别用于沿指定轴拼接多个数组以及在指定轴上追加数组元素。
50 0
Numpy学习笔记(五):np.concatenate函数和np.append函数用于数组拼接
|
2月前
|
Python
使用 NumPy 进行数组操作的示例
使用 NumPy 进行数组操作的示例
39 2
|
2月前
|
索引 Python
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧1
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
116 4
|
2月前
|
机器学习/深度学习 并行计算 调度
CuPy:将 NumPy 数组调度到 GPU 上运行
CuPy:将 NumPy 数组调度到 GPU 上运行
113 1
|
3月前
|
Python
numpy | 插入不定长字符数组测试OK
本文介绍了如何在numpy中创建和操作不定长字符数组,包括插入和截断操作的测试。