最近在做一些工作,需要做如下操作。
def myfunc(a, b):
return a*b # some operation here
a = [1,2,3]
b = [2,4,6,8]
print [[myfunc(i, j) for i in a] for j in b]
我需要从一维数组创建一个二维数组,如上所示。
有人可以告诉我使用 numpy
操作来做到这一点的方法吗?
数组a
和b
非常长。所以我假设 numpy 会提高性能。
最佳答案
您可以使用 numpy broadcasting :
a = np.array([1,2,3])
b = np.array([2,4,6,8])
a = a[:, None]
b = b[None, :]
a * np.log(a/b)
向 a
和 b
添加一个新轴(分别作为第二和第一轴)将使 a
的形状 ( 3, 1)
和b
的形状(1, 4)
。然后,a/b
一个二维 (3, 4)
数组,其中第 i
列是 a[i]/b
:
a/b
array([[ 0.5 , 0.25 , 0.16666667, 0.125 ],
[ 1. , 0.5 , 0.33333333, 0.25 ],
[ 1.5 , 0.75 , 0.5 , 0.375 ]])
然后您可以取逐点对数并乘以a
。由于 np.log(a/b)
是 (3, 4) 而 a
是 (3, 1),a
将再次被广播到 (3, 4)。
一个小细节是,由于广播发生的方式,将第二个轴添加到 b
不是强制性的。尽管如此,为了清楚起见,我更愿意将其明确写出来。
关于python - 等效于使用 numpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40649923/