python - 遍历 NumPy 数组行/列并修改值

标签 python arrays python-3.x numpy

A = np.array([[1,2,3], [4,5,6], [7,8,0]]) 
for x in A[1,:]:
    if x < failure_tolerance:
         x = 0

这显然行不通,因为可写性发生了一些变化,但我不能支持它。

最佳答案

问题是这里只有x被改变了。 x 引用数组中的特定单元格,它包含对数组中元素的引用(但不是包含元素的单元格)。

尽管如此,当您想对批量矩阵执行计算时,通常会使用 numpy 结构:

A = np.array([[1,2,3], [4,5,6], [7,8,0]]) 
A[1,<b>A[1,:] < failure_tolerance</b>] = 0

在这里A[1,:] < failure_tolerance将构造一个小于 failure_tolerance 的值的掩码.接下来我们设置 0 A 中的所有这些值.

例如(使用 failure_tolerance = 5 ):

>>> failure_tolerance = 5
>>> A[1,A[1,:] < failure_tolerance] = 0
>>> A
array([[1, 2, 3],
       [0, 5, 6],
       [7, 8, 0]])

如您所见,第二行的第一个元素 ( 4 ) 现在已替换为 0因为它小于 5 .

通常当您使用 numpy 执行调用时,它会运行得更快,因为 numpy 不在 Python 中执行这些调用,而是在 C 中使用高性能数据结构和算法。对于(非常)小的矩阵,不会有任何区别(由于调用开销,numpy 可能会花费更长的时间),但是如果您处理巨大的矩阵,numpy 肯定会胜过用 Python 编写的任何解决方案。

此外,这种语法非常具有声明性:训练有素的 numpy 开发人员会立即理解您设置的值小于 failure_tolerance .

编辑:

如果您需要多个条件,可以使用 |作为逻辑或和 &作为逻辑与。例如:

A = np.array([[1,2,3], [4,5,6], [7,8,0]]) 
A[1,(A[1,:] < failure_tolerance)<b> & (A[1,:] > at_least_value)</b>] = 0

这将设置 A第二行的所有值至 0鉴于这些值介于 at_least_value 之间和 failure_tolerance .

关于python - 遍历 NumPy 数组行/列并修改值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44043441/

相关文章:

java - 打印数组变量,而不是变量指针位置

javascript - 如何使用单行 for 循环在 JavaScript 中创建网格?

python - 在桌面壁纸 Ubuntu 上转换 TensorFlow 对象检测的输出

python - sqlalchemy apache mod_wsgi Pyramid 崩溃

python - 对类中的方法进行排序

python - 复合 if elif else 语句 + python

Python Excel 模板读取和重写,维护公式和格式

c - 为函数分配参数

python-3.x - Scrapy 日志记录级别更改

python - 有没有办法从 DataFrame.from_dict 中删除列号和行号?