我正在尝试填充一个 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
两个一维数组或列表的双循环通常可以像这样转换为外部操作。
