我是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
问题是x和y是数组,而不是单个元素。以下是代码在遇到错误之前的计算结果:
对于Python来说,评估整个数组是真是假毫无意义。如果要使用If语句,必须遍历数组并检查单个元素是否小于截止值,而不是整个数组。在
^{pr2}$但是,由于使用的是NumPy,所以不需要if语句,可以利用vectorization在一行中解决问题。在
在数组的基础上,对数组进行运算
array([0, 0, 0, 3]) > 2
将产生{Rohanp的解决方案是可行的,但是我也建议使用有用的numpy函数^{} ,它可以用两种方式之一使用。在
选项1:插入值以直接创建z
注意使用&;而不是“and”!在
选项2:返回条件为真的索引
如果您不想简单地插入一个值或另一个值,但可能只对那些值为true的位置进行一些更复杂的分析,而忽略其余的值,则这会更有用
^{pr2}$相关问题 更多 >
编程相关推荐