Python 错误,"NumPy boolean array indexing assignment requires a 0 or 1-dimensional input, input has 2



我对python有点陌生,目前正在处理一个项目,并在这行代码中遇到此错误。

g1_coll[obstacle==0]=tau*(g1+g2-g3+g4)
g2_coll[obstacle==0]=tau*(g1+g2+g3-g4)
g3_coll[obstacle==0]=tau*(-g1+g2+g3+g4)
g4_coll[obstacle==0]=tau*(g1-g2+g3+g4)

谁能帮我理解这一点?

我假设你得到的错误是因为你所有的数组都是二维的。我建议你尝试使用numpy.putmask(matrix, mask, new_matrix_values)

例如

mask = (obstacle == 0)
numpy.putmask(g1_coll, mask, tau*(g1+g2-g3+g4))
numpy.putmask(g2_coll, mask, tau*(g1+g2+g3-g4))
numpy.putmask(g3_coll, mask, tau*(-g1+g2+g3+g4))
numpy.putmask(g4_coll, mask, tau*(g1-g2+g3+g4))

以下内容可能也应该有效

mask = (obstacle == 0)
new_array = tau*(g1+g2-g3+g4)
g1_coll[mask]= new_array[mask]

请注意最后一个[mask]

我认为其他答案提到了问题的根源(例如,melqkiades答案(。我试图以另一种方式重现这个问题,从这篇文章中得到启发。

因此,如果我们使用np.matrix(即 2D(就会发生这样的错误 - 不再建议使用此类,即使是线性代数。而是使用常规数组。该类将来可能会被删除(而不是np.array,我试图在以下代码中解释:

# Note that using np.array instead of np.matrix will get a 1D array with shape --> (4,)    ==1D==> 1D res is expected
g_coll = np.matrix([0.94140464, 0.96913727, 0.43559733, 0.45494222])   # shape --> (1, 4)  ==2D==> 2D res may be expected wrongly
# [[0.94140464 0.96913727 0.43559733 0.45494222]]
my_boolean_array = g_coll < 0.5                                        # shape --> (1, 4)
# [[False False  True  True]]
# g_coll[my_boolean_array]                                             # shape --> (1, 2)
# [[0.43559733 0.45494222]]
# The point is here, where we are expecting res to be 2D, wrongly, because g_coll[my_boolean_array] is in 2D, but that must be 1D
res = np.array([[0, 0]])                            # shape --> (1, 2)
g_coll[my_boolean_array] = res                      # --> res must be 1D: np.array([0, 0])
# The true answer will be as:
# res = np.array([0, 0])                            # 1D --> shape: (2,)
# g_coll[my_boolean_array] = res
# # [[0.94140464 0.96913727 0.         0.        ]]

问题是您使用掩码分配的内容。不知道 g1、g2、g3 和 g4 里面有什么,很难理解你在做什么,但可能

tau*(g1+g2-g3+g4)

是二维向量。相反,您需要分配单个值。例如,如果您以这种方式更改作业,它可能会起作用:

g1_coll[obstacle==0]=(tau*(g1+g2-g3+g4))[0]
g2_coll[obstacle==0]=(tau*(g1+g2+g3-g4))[0]
g3_coll[obstacle==0]=(tau*(-g1+g2+g3+g4))[0]
g4_coll[obstacle==0]=(tau*(g1-g2+g3+g4))[0]

或者,如果它不起作用:

g1_coll[obstacle==0]=(tau*(g1+g2-g3+g4))[0][0]
g2_coll[obstacle==0]=(tau*(g1+g2+g3-g4))[0][0]
g3_coll[obstacle==0]=(tau*(-g1+g2+g3+g4))[0][0]
g4_coll[obstacle==0]=(tau*(g1-g2+g3+g4))[0][0]

但在做任何事情之前,你应该了解你的输入(tau*(g1+g2-g3+g4)(。

我的猜测是,g1、g2、g3 和 g4 可能是二维向量

通过此示例,我可以重现您的错误:

import numpy as np
import random

my_matrix = np.random.rand(4)
print(my_matrix)
my_boolean_array = my_matrix < 0.5
print(my_boolean_array)
my_matrix[my_boolean_array] = [[0, 0]] # two dimensions array! not a single value. This will not work
print(my_matrix)

尝试打印里面的值

print(tau*(g1+g2-g3+g4))

相关内容

最新更新