我经常发现自己必须在二维数组中创建一条线(或某种其他形状)。换句话说,除了 y = mx + c 之外,数组的值在任何地方都是零。 (此外 - 这种方法的动机,而不是将一条线存储在一维数组中,是因为我的工作经常需要二维傅立叶变换,所以除了线/形状/等等之外,我需要到处都是零)。
我通常的做法如下:
array = numpy.zeros((height, width))
for i, line in enumerate(array):
for j, pixel in enumerate(line):
if j == m*i + c:
array[i,j] = 1
这很好用,但它并没有给我留下特别的 pythonic 印象,而且当数组变大时它往往会变得很慢。所以,我的问题是一个相当笼统的问题 - 有人知道这样做的更好方法吗?
提前致谢!
请您参考如下方法:
你可以使用 broadcasting在这里摆脱那些嵌套循环-
import numpy as np
out = (np.arange(height) == m*np.arange(width)[:,None]+c)+0.0
作为验证正确性的示例,使用这些参数 -
height = 10
width = 10
m = 0.5;
c = 6;
你会 -
In [306]: array
Out[306]:
array([[ 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
In [307]: out
Out[307]:
array([[ 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]])
