二维数组上的numpy逻辑运算

时间:2017-01-26 09:46:25

标签: python arrays numpy

假设我们有一组值:n - 行和6列(n,6)。 如果第三个元素超过第四个元素,如何将一行中的第四个元素替换为第三个元素?

我试图以这样的方式做到:

griddata[:,3][griddata[:,2] > griddata[:,3]] = griddata[:,2]
  

TypeError:'numpy.float64'对象不支持项目分配

1 个答案:

答案 0 :(得分:2)

您可以改为使用np.where

griddata[:,3] = np.where(griddata[:,2] > griddata[:,3], griddata[:,2], griddata[:,3])

griddata[:,3]替换griddata[:,2]条件(griddata[:,2] > griddata[:,3])为True,否则使用第三个参数(原始):griddata[:,3]

小样本:

>>> griddata = np.array([[1,2,3,4,5,6], [6,5,4,3,2,1]])
>>> griddata
array([[1, 2, 3, 4, 5, 6],
       [6, 5, 4, 3, 2, 1]])

>>> griddata[:,3] = np.where([griddata[:,2] > griddata[:,3]], griddata[:,2], 
>>> griddata
array([[1, 2, 3, 4, 5, 6],
       [6, 5, 4, 4, 2, 1]])

为什么你的方法不起作用:

griddata[:,3][griddata[:,2] > griddata[:,3]]包含x个元素,其中x是条件True的数量,但griddata[:,2]始终包含n个元素。因此,在任何情况下(除非griddata[:,2] > griddata[:,3]对所有行都为True),您将尝试将n项放在x个插槽中。那是行不通的。

您需要屏蔽双方才能使其正常工作:

griddata[:,3][griddata[:,2] > griddata[:,3]] = griddata[:,2][griddata[:,2] > griddata[:,3]]
#                                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^