python - 等效于使用 numpy

标签 python arrays numpy vectorization

最近在做一些工作,需要做如下操作。

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 操作来做到这一点的方法吗?

数组ab 非常长。所以我假设 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)

ab 添加一个新轴(分别作为第二和第一轴)将使 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/

相关文章:

python - 如何比较python中的数组列表?

c - 打印输出时出现段错误

python - Numpy 字符串分区 : Perform Multiple Splits

c - 需要类型为 'int' 的参数,但参数 2 的类型为 'int **'

java - 重写嵌套 for 循环以提供更好的格式化输出

python - 删除 numpy 数组中第一次出现的元素

java - 是否有 Java 数学库允许像 numpy 那样进行矢量化和广播?

python - 在python中,可以使用缓冲区遍历大型文本文件并同时获得正确的文件位置吗?

python - Groovy 脚本无法执行外部进程

python - 通过从 json 创建新对象来消除嵌套