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/