简单的Numpy 2D矩阵和meshgrid值错误:具有多个元素的数组的真值不明确

2024-04-27 15:20:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python的新手,这个任务可能很简单,但我还不明白。我试图用网格来模拟光通过二维光圈的传输:如果光被传输,网格元素是1;如果不是,那么是0。在

我在迭代二维矩阵时遇到了麻烦。我认为在比较numpy数组的元素和标量值时有一个问题,特别是因为必须满足两个条件。我尝试了a.any()和a.all(),&;和np.逻辑(),但我似乎无法让他们工作。在

def make_object(x,y,a,b):
    f = np.zeros((len(x),len(y)))

    if np.abs(x) < (a/2.0):
        if np.abs(y) < (b/2.0):
            f[x][y] = 1.0
    return f


a = 6.0  # Width of slit
b = 6.0  # Height of slit
N = 20.0
x = np.linspace(-10.0,10.0,N)
y = np.linspace(-10.0,10.0,N)
X,Y = np.meshgrid(x,y)

z = make_object(X,Y,a,b)
print z

我收到以下错误消息:

^{pr2}$

你知道我做错了什么吗?在

编辑:以前使用的没有矢量化的代码

for i, xi in enumerate(x):
    for j, yj in enumerate(y):
        if np.abs(xi) < a/2:
            if np.abs(yj) < b/2:
                f[i][j] = 1.0

Tags: ofin网格元素formakelenif
2条回答

问题是x和y是数组,而不是单个元素。以下是代码在遇到错误之前的计算结果:

if array([True, False, ... ]):

对于Python来说,评估整个数组是真是假毫无意义。如果要使用If语句,必须遍历数组并检查单个元素是否小于截止值,而不是整个数组。在

^{pr2}$

但是,由于使用的是NumPy,所以不需要if语句,可以利用vectorization在一行中解决问题。在

f[ np.logical_and(np.abs(x) < a/2.0,  np.abs(y) < b/2.0) ] = 1

在数组的基础上,对数组进行运算

array([0, 0, 0, 3]) > 2将产生{}

Rohanp的解决方案是可行的,但是我也建议使用有用的numpy函数^{},它可以用两种方式之一使用。在

选项1:插入值以直接创建z

truevals = numpy.ones_like(X) #(or = numpy.zeros_like(X) + desired_value)
falsevals = numpy.zeros_like(X)
z = numpy.where((np.abs(X) < 6.0) & (np.abs(Y) < 6.0), truevals, falsevals)  

注意使用&;而不是“and”!在

选项2:返回条件为真的索引

如果您不想简单地插入一个值或另一个值,但可能只对那些值为true的位置进行一些更复杂的分析,而忽略其余的值,则这会更有用

^{pr2}$

相关问题 更多 >