【问题标题】:Equivalent using numpy等效于使用 numpy
【发布时间】:2016-11-17 08:28:02
【问题描述】:

对于我最近在做的一些工作,需要做如下操作。

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 会提高性能。

【问题讨论】:

  • 为了性能,向量化函数本身是有意义的。那么,在您的实际用例中,operation 到底是什么?
  • @Divakar:是a * log(a/b)
  • 你想从数组a = [1,2,3]和b = [2,4,6,8]得到什么结果?
  • @Ramesh-X 由 Jaroslaw 指定,最好在输入和输出中包含一个小示例。

标签: python arrays numpy vectorization


【解决方案1】:

你可以使用 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-th 列是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 不是强制性的。不过,为了清楚起见,我更喜欢明确地写出来。

【讨论】:

    【解决方案2】:

    这是特定于您的功能的

    a * np.log(np.divide.outer(a, b)).T
    
    [[-0.69314718  0.          1.21639532]
     [-1.38629436 -1.38629436 -0.86304622]
     [-1.79175947 -2.19722458 -2.07944154]
     [-2.07944154 -2.77258872 -2.94248776]]
    

    比较你的解决方案

    f = lambda a, b: a * np.log(a/b)
    
    np.array([[f(i, j) for i in a] for j in b])
    
    [[-0.69314718  0.          1.21639532]
     [-1.38629436 -1.38629436 -0.86304622]
     [-1.79175947 -2.19722458 -2.07944154]
     [-2.07944154 -2.77258872 -2.94248776]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 2021-09-10
      • 1970-01-01
      • 2018-09-15
      • 2016-06-04
      • 2023-03-03
      • 2018-02-20
      相关资源
      最近更新 更多