Skip to main content
 首页 » 编程设计

python之循环遍历 2D numpy 数组(例如创建一条线)

2025年05月04日14zdz8207

我经常发现自己必须在二维数组中创建一条线(或某种其他形状)。换句话说,除了 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.]])