-1

我想通过矢量化来删除以下 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() ?所以你怎么看?

4

2 回答 2

0

以下:

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]]

快速预览以便更好地理解:

在此处输入图像描述

于 2020-10-13T16:37:11.227 回答
0

没有更多信息很难回答你的问题(你想创建数组吗?它已经创建了吗??为什么你的 v, u 索引“向后”?...

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

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

import numpy as np

rows = 10
cols = 5

values = np.zeros((rows, cols, 3))

values[:,:,0] = np.fromfunction(
    lambda r, c: -0.5 + c / (cols - 1),
    (rows, cols))

values[:,:,1] = np.fromfunction(
    lambda r, c: (-0.5 + r / (rows - 1) * rows / cols),
    (rows, cols))

请注意,有很多方法可以用 numpy 做你想做的事。

以上只是一个,并且以更扩展,更易于理解的方式编写。你可能可以在一行中做同样的事情,但如果你是 numpy 的新手,那就更难理解了。

于 2020-10-13T16:48:24.420 回答