循环遍历NumPy数组行/列并修改值

时间:2017-05-18 09:12:06

标签: 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

这显然不起作用,因为可写性有一些事情发生但我无法支持它。

1 个答案:

答案 0 :(得分:2)

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

然而,当你想在批量中对矩阵进行计算时,通常会使用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,因为这些值介于0at_least_value之间。