如何在Python中矢量化以删除for循环?

如何在Python中矢量化以删除for循环?,python,numpy,for-loop,vectorization,linspace,Python,Numpy,For Loop,Vectorization,Linspace,我想通过矢量化删除以下Python代码中的for循环。我搜索了堆栈溢出和整个互联网,以找到一个解决方案,但没有结果 for v in range(height): for u in range(width): start[v,u,0] = -0.5 + u / (width-1) start[v,u,1] = (-0.5 + v / (height-1)) * height / width start[v,u,2] = 0 我想我们应该用NumPy。可能要使用num

我想通过矢量化删除以下Python代码中的for循环。我搜索了堆栈溢出和整个互联网,以找到一个解决方案,但没有结果

for v in range(height):
  for u in range(width):
    start[v,u,0] = -0.5 + u / (width-1)
    start[v,u,1] = (-0.5 + v / (height-1)) * height / width
    start[v,u,2] = 0
我想我们应该用NumPy。可能要使用numpy.linspace()?那么,你认为呢?

以下几点:

start[v,u,0] = -0.5 + u / (width-1)
start[v,u,1] = (-0.5 + v / (height-1)) * height / width
start[v,u,2] = 0
如果
v
u
是花哨的索引,则工作正常:

start = np.random.randint(99, size=(5,7,3)).astype(float)
height, width = start.shape[:2]
v, u = np.indices((height, width))
样本运行(值四舍五入):

>>> v
[[0 0 0 0 0 0 0]
 [1 1 1 1 1 1 1]
 [2 2 2 2 2 2 2]
 [3 3 3 3 3 3 3]
 [4 4 4 4 4 4 4]]
>>> u
[[0 1 2 3 4 5 6]
 [0 1 2 3 4 5 6]
 [0 1 2 3 4 5 6]
 [0 1 2 3 4 5 6]
 [0 1 2 3 4 5 6]]
>>> start[v,u,0]
[[-0.5  -0.33 -0.17  0.    0.17  0.33  0.5 ]
 [-0.5  -0.33 -0.17  0.    0.17  0.33  0.5 ]
 [-0.5  -0.33 -0.17  0.    0.17  0.33  0.5 ]
 [-0.5  -0.33 -0.17  0.    0.17  0.33  0.5 ]
 [-0.5  -0.33 -0.17  0.    0.17  0.33  0.5 ]]
>>> start[v,u,1]
[[-0.36 -0.36 -0.36 -0.36 -0.36 -0.36 -0.36]
 [-0.18 -0.18 -0.18 -0.18 -0.18 -0.18 -0.18]
 [ 0.    0.    0.    0.    0.    0.    0.  ]
 [ 0.18  0.18  0.18  0.18  0.18  0.18  0.18]
 [ 0.36  0.36  0.36  0.36  0.36  0.36  0.36]]
快速预览,以便更好地理解:


如果没有更多信息,很难回答您的问题(您想创建数组吗?它已经创建了吗?为什么您的v,u表示“向后”

但是要回答你的问题,是的-有很多方法可以让你想用numpy做什么

看看下面,然后花一两个小时阅读一些numpy教程等:

将numpy导入为np
行=10
cols=5
值=np.零((行、列、3))
值[:,:,0]=np.fromfunction(
λr,c:-0.5+c/(cols-1),
(行、列)
值[:,:,1]=np.fromfunction(
λr,c:(-0.5+r/(行-1)*行/列),
(行、列)
请注意,有许多方法可以使用numpy实现您想要的功能


以上只是其中一个,并且是以一种更为扩展、更易于理解的方式编写的。您可能可以在一行中完成同样的事情,但如果您是numpy新手,则更难理解。

这些变量都是从什么开始的?
start[v,u,0]
表明您已经在使用numpy。欢迎使用StackOverflow!请花时间阅读这篇文章,了解如何以及如何提供索引并相应地修改您的问题。您似乎可以使用
ax0,ax1=np.ogrid[:height,:width
]