以Python方式填充2D numpy数组
我正在尝试填充2D numpy数组。 根据我的经验,以下内容不能很好地扩展到阵列大小以Python方式填充2D numpy数组,python,arrays,numpy,list-comprehension,Python,Arrays,Numpy,List Comprehension,我正在尝试填充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 理想情况下,我想使用列表理解 如果它
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
理想情况下,我想使用列表理解
如果它只是1D,那就简单了
mat=np.asarray([foo(x_) for x_ in x])
但如何将其推广到2D np.数组?
其他基于
numpy
的解决方案也适用,但效率是这里的关键指标可以构建二维嵌套列表理解:
mat = np.array([[1 if x_ > y_ else -1 for y_ in y] for x_ in x])
然而,这可能变得非常不可读,就性能扩展而言,这与for循环没有太大区别。矢量化通常在较大的阵列中工作得更好:
mat = (x[:, None] > y[None, :]) * 2 - 1
可以构建二维嵌套列表理解:
mat = np.array([[1 if x_ > y_ else -1 for y_ in y] for x_ in x])
然而,这可能变得非常不可读,就性能扩展而言,这与for循环没有太大区别。矢量化通常在较大的阵列中工作得更好:
mat = (x[:, None] > y[None, :]) * 2 - 1
尝试:
尝试:
您的垫
:
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)
使用将布尔掩码转换为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]])
或者,您可以将布尔值转换为0/1数组,并根据需要进行缩放
(x[:,None]>y).astype(float)*2-1
两个1d数组或列表上的双循环通常可以转换为这样的外部操作。您的mat
:
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)
使用将布尔掩码转换为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]])
或者,您可以将布尔值转换为0/1数组,并根据需要进行缩放
(x[:,None]>y).astype(float)*2-1
两个1d数组或列表上的双循环通常可以转换为这样的外部操作。如果使用numpy:
import numpy as np
nx = x.size
ny = y.size
mat = np.sign(x * np.atleast_2d(np.ones(ny)).T - np.ones(nx) * np.atleast_2d(y).T)
mat[np.where(mat==0)] = -1
numpy将注意效率(无论这里是什么意思)。如果使用numpy:
import numpy as np
nx = x.size
ny = y.size
mat = np.sign(x * np.atleast_2d(np.ones(ny)).T - np.ones(nx) * np.atleast_2d(y).T)
mat[np.where(mat==0)] = -1
numpy将关注效率(无论它在这里意味着什么)。您是在寻找一个通用解决方案还是像示例中那样填充矩阵的三角形部分?我的应用案例就是其中之一。然而,一个通用的解决方案可能对更多的用户有用。。。如果有一个通用的foo(x_uu,y_u)能与两个输入类似于上一个代码行一起工作,那就太好了。你是在寻找一个通用的解决方案,还是特别像示例中那样填充矩阵的三角形部分?我的应用案例就是其中之一。然而,一个通用的解决方案可能对更多的用户有用。。。如果有一个与通用foo(x,y)一起工作的东西会很好,它有两个类似于最后一行代码的输入。你也可以通过-1
来重塑,而不是x.shape[0]
。你也可以通过-1
来重塑,而不是x.shape[0]
。最后,你回答(没有最后一行)是解决我实际问题的办法。然而,因为我在问题中犯了一个错误,错误地描述了当x==y时所需的行为,所以我不能接受它。但是谢谢:)最后,你的回答(没有最后一行)是解决我实际问题的方法。然而,因为我在问题中犯了一个错误,错误地描述了当x==y时所需的行为,所以我不能接受它。但是谢谢:)