【问题标题】:Python function with a variable amount of numpy arrays具有可变数量的 numpy 数组的 Python 函数
【发布时间】:2016-10-12 12:21:53
【问题描述】:

我有一个函数可以计算两个大型 np.arrays (>1000L, >1000L) 之间的一些比率:

def error(crm1, crm2):

    delta1 = np.zeros((crm1.shape[0], crm1.shape[1]))
    delta2 = np.zeros((crm2.shape[0], crm2.shape[1]))
    stt = np.int(crm1.shape[0])
    stp = np.int(crm1.shape[1])

    for m in xrange(stt):
        for n in xrange(stp):
            s1 = crm1[m, n]
            s2 = crm2[m, n]

            w1 = (min(s1, s2)**2)/s1
            w2 = (min(s1, s2)**2)/s2

        delta1[m, n] = w1
        delta2[m, n] = w2

    return (delta1, delta2)

现在我意识到我必须计算可变数量的 np.arrays(相同维度和数据类型)之间的比率,例如:

# Case 1
error(array1, array2)

# Case 2
error(array1, array2, array3, array4)

# Case 3
error(array1, array2, array3, array4, array5, array6)

如果可能的话,我不想为每种情况编写代码,因为我有很多函数,比如 error() 函数。是否可以更改代码以使函数与可变数量的 np.arrays 一起使用?

【问题讨论】:

  • 顺便说一句你可以做np.zeros_like(crm1)我认为...它更简单。
  • @JohnZwinck 使用np.zeros_like(crm1, dtype=np.float64) 可能会更安全,以防调用者传入整数数据类型的数组。
  • @petermailpan 为什么for n in xrange(stp+1): 中有+1?这将使n 的最后一个值太大而不能成为crm1 的第二个索引,并导致IndexError
  • 为什么不使用delta1 = np.minimum(crm1, crm2)**2/crm1(假设crm2crm1具有相同的形状)而不是循环?它应该更快。

标签: arrays python-2.7 function numpy


【解决方案1】:

你可以使用*args(重要的是在参数名称前加上*,你可以调用你的参数*foo)。您还应该使用 numpy 向量化而不是遍历数组。

import numpy as np
def err(*args):
     # compute the pointwise min once and for all
     pointwise_min2 = np.minimum(*args)**2
     return tuple([pointwise_min2/arr for arr in args])

(如果所有数组都具有相同的形状,我假设这是因为否则您问题中的计算毫无意义)。

【讨论】:

  • 现在我明白了。它返回一个包含 *args 数量的所有比率的元组,我可以通过索引元组来提取各个比率。非常感谢大家的建议!
  • 也可以直接解包元组:delta1, delta2 = err(crm1, crm2)
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多