假设我们有一组值:n-行和6列(n,6)。
如果第3个元素大于第4个元素,如何将第4个元素替换为等于第3个元素?

我试图以这种方式做到这一点:

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



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

最佳答案

您可以使用np.where代替:

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


在条件(griddata[:,3])为True的所有地方都将griddata[:,2]替换为griddata[:,2] > griddata[:,3],否则将第三个参数(原始)替换为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]]
#                                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

10-07 15:11