Skip to main content
 首页 » 编程设计

python之以 pythonic 方式填充 2D numpy 数组

2025年05月04日16over140

我正在尝试填充一个 2D numpy 数组。 根据我的经验,以下内容不会随着数组大小的增加而很好地扩展。

x=np.array([2,3,4]) 
y=np.array([1,3,9,13]) 
mat=np.zeros((x.size,y.size)) 
for i in range(nx): 
 for j in range(ny): 
   if x[i] > y[j]: 
        mat[i,j] = 1 
   else: 
        mat[i,j] = -1 

理想情况下,我想使用列表推导式 如果只是一维就简单了

mat=np.asarray([foo(x_) for x_ in x]) 

但是如何将其推广到二维 np.arrays? 其他基于 numpy 的解决方案也适用,但效率是这里的关键指标

请您参考如下方法:

你的垫子:

In [352]: mat 
Out[352]:  
array([[ 1., -1., -1., -1.], 
       [ 1., -1., -1., -1.], 
       [ 1.,  1., -1., -1.]]) 

针对 y 广播 x:

In [353]: x[:,None]>y 
Out[353]:  
array([[ True, False, False, False], 
       [ True, False, False, False], 
       [ True,  True, False, False]], dtype=bool) 

使用 where 将该 bool 掩码转换为 1/-1 数组:

In [354]: np.where(x[:,None]>y,1,-1) 
Out[354]:  
array([[ 1, -1, -1, -1], 
       [ 1, -1, -1, -1], 
       [ 1,  1, -1, -1]]) 

或者您可以将 bool 值转换为 0/1 数组,并缩放以适合

(x[:,None]>y).astype(float)*2-1 

两个一维数组或列表的双循环通常可以像这样转换为外部操作。