Numpy操作依赖于x/y索引的真值数组

2024-10-03 13:27:21 发布

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

所以我有一个数组(大的-2048x2048),我想根据它们所在的位置执行一些元素操作。我很困惑如何做到这一点(我被告知不要使用for循环,当我尝试我的IDE冻结时,它的速度非常慢)。在

关于这个问题:

h = aperatureimage
h[:,:] = 0
indices = np.where(aperatureimage>1)

for True in h:
    h[index] = np.exp(1j*k*z)*np.exp(1j*k*(x**2+y**2)/(2*z))/(1j*wave*z)

所以我有一个索引,它(我在这里假设)本质上是我的大孔径图像数组的“裁剪”版本。*注:光圈图像是一个灰度图像转换成一个数组,它有一个形状或文字,我想找到所有'白色'区域的光圈和执行我的操作。在

如何访问索引的各个x/y值,以便执行指数运算?当我尝试索引[:,None]时,会导致程序输出“ValueError:broadcast dimensions too large”。我也得到了数组不可广播的形状。任何帮助都将不胜感激!在

还有一个澄清:x和y是我想要更改的唯一值(本质上是数组中有white、z、k和前面定义的其他值的点)。在

编辑:

我不确定我上面发布的代码是否正确,它返回两个空数组。当我这么做的时候 索引=(孔径图像==1) 打印长度(索引)

事实上,到目前为止我所做的一切都是正确的。我有一张2048x2048的图像,中间有一个128x128的白色正方形。我想将这个图像转换成一个数组,查看所有的值并确定索引值(x,y),其中数组不是黑色的(我只有白色/黑色,双层图像不适合我)。然后我想取数组不为0的所有值(x,y),然后乘以上面列出的h[index]值。在

如果需要,我可以发布更多信息。如果你看不出来,我就卡住了。在

这里有一些代码可能会有帮助-我想我已经解决了上面的问题(我现在可以访问数组的成员并对它们执行操作)。但是-由于某些原因,for循环中的Fx值从未增加,它循环Fy永远。。。。在

^{pr2}$

您需要numpy、scipy和PIL来处理这些代码。在

当我运行这个程序时,它会遍历代码,但是其中没有数据(所有内容都是黑色的)。现在我遇到了一个真正的问题,因为我不完全理解我正在做的数学(这是针对HW的),而且我对Python也没有很好的理解。在

U[index[0],index[1]] = aperaturearray[index[0],index[1]] * np.exp(1j*k*((index[0]-middle)**2+(index[1]-middle)**2)/(2*z))

那条线应该在我的数组上执行元素计算吗?在


Tags: 代码图像程序元素middleforindexnp
1条回答
网友
1楼 · 发布于 2024-10-03 13:27:21

你能发布一个最小的,但完整的例子吗?一个我们可以复制/粘贴并运行自己的?在

同时,在当前示例的前两行:

h = aperatureimage
h[:,:] = 0

将“apertureImage”和“h”都设置为0。那可能不是你想要的。您可能需要考虑:

^{pr2}$

这将生成apertureImage的副本,而代码只需将h指向与apertureImage相同的数组。所以改变一个就会改变另一个。 请注意,复制非常大的数组可能会消耗比您更大的内存。在

我想你想做的是:

import numpy as np

N = 2048
M = 64

a = np.zeros((N, N))
a[N/2-M:N/2+M,N/2-M:N/2+M]=1

x,y = np.meshgrid(np.linspace(0, 1, N), np.linspace(0, 1, N))

b = a.copy()

indices = np.where(a>0)

b[indices] = np.exp(x[indices]**2+y[indices]**2)

或者类似的东西。在任何情况下,这将基于x/y坐标在“b”中设置一些值,其中“a”大于0。试着用imshow可视化它。祝你好运!在

关于编辑

您应该规范化您的输出,使其适合8位整数。目前,其中一个数组的最大值远大于255,而另一个数组的最大值则小得多。试试这个:

fim = Image.fromarray(np.uint8(255*Ufim/np.amax(Ufim)))
fim.save("PATH\Fim.jpg")
ftfm = Image.fromarray(np.uint8(255*Utfm/np.amax(Utfm)))
ftfm.save("PATH\FTFM.jpg")

同时考虑np.Zero类()而不是复制和清除H和U

最后,我个人非常喜欢与ipython一起开发类似的东西。如果将衍射函数中的代码放在脚本的顶层(代替“If”name_ux&c.),则可以直接从ipython访问变量。一个快速的命令np.amax公司(Utfm)会告诉你确实有价值!=0。imshow()总是很好地查看矩阵。在

相关问题 更多 >