A = np.array([[1,2,3], [4,5,6], [7,8,0]])
for x in A[1,:]:
if x < failure_tolerance:
x = 0
这显然不起作用,因为可写性有一些事情发生但我无法支持它。
答案 0 :(得分:2)
问题是这里只改变了STARTED
。 x
不引用数组中的特定单元格,它包含对数组中元素的引用(但不包含对包含该元素的单元格)。
然而,当你想在批量中对矩阵进行计算时,通常会使用numpy结构:
x
此处A = np.array([[1,2,3], [4,5,6], [7,8,0]])
A[1,A[1,:] < failure_tolerance] = 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
。
通常在使用numpy执行调用时,它会运行得更快,因为numpy不会在Python中执行这些调用,而是在C中使用高性能数据结构和算法。对于(非常)小矩阵,不会有任何差别(由于调用开销,numpy可能会花费更长的时间),但如果使用大型矩阵,numpy肯定会胜过用Python编写的任何解决方案。
此外,这种语法非常具有说明性:训练有素的numpy开发人员会立即明白你设置的值小于5
。
修改强>:
如果您需要多个条件,可以使用failure_tolerance
作为逻辑或|
作为逻辑和。{例如:
&
这会将A = np.array([[1,2,3], [4,5,6], [7,8,0]])
A[1,(A[1,:] < failure_tolerance) & (A[1,:] > at_least_value)] = 0
的第二行行的所有值设置为A
,因为这些值介于0
和at_least_value
之间。