【问题标题】:Adding arrays of variable length添加可变长度的数组
【发布时间】:2017-06-20 13:13:03
【问题描述】:

我的一个函数生成一个可变长度列表的结果,例如 [1, 2, 3, ...] 等。随着这些列表的出现,我想将它们全部添加到此列表中的某个主列表中时尚:

out: [1, 2]
out: [3] 
  sum:[4,2]
out: [0, 0, 0, 2] 
  sum: [4, 2, 0, 2]
out: [3, 1] 
  sum: [7, 3, 0, 2] 

等等。

我还需要能够对这些进行操作 - 例如:

[1, 2, 3, 4]/N = [1/N, 2/N, ...] 

numpy 数组是我想要的格式吗?我似乎无法让它工作。

【问题讨论】:

  • 后者绝对可以使用 NumPy 轻松高效地完成。

标签: python arrays numpy matrix


【解决方案1】:

您可以使用 python 2.x 中的 map/itertools.izip_longest 或 python 3.x 中的 itertools.zip_longest 来完成功能

话虽如此,

  • 遍历map函数结果中的所有元素
  • 对于each子列表,可以使用python的sum()内置函数。
  • 要处理无值,请检查None 是否存在于each 变量中。如果存在,则遍历该子列表,检查每个元素 i 是否为 None,如果是,则将其替换为 0。

也就是说,

>>> addFn = lambda a,b: [sum(each) if None not in each else sum(i if i else 0 for i in each )for each in map(None,a,b)]
>>> addFn([1,2,3],[4])
[5, 2, 3]
>>> addFn(addFn([1,2,3],[4]),[7,3,0,2])
[12, 5, 3, 2]

对于第二个功能,如果l 如果您的列表,那么

对于l中的每个元素i,转换分子或分母float并执行操作!

>>> divByN = lambda l,N:[i/float(N) for i in l]
>>> divByN([5,6,7,8],2)
[2.5, 3.0, 3.5, 4.0]

正如 Baldrickk 所说,这里有一个使用 itertools 的示例,

from itertools import izip_longest as izip_l 
sum = [a+b for a,b in izip_l(arr1,arr2, fillvalue=0)]

【讨论】:

  • 我打算提供一个 izip_longest 答案,但我看到你提到了它。你没有提供一个例子,所以请随意使用:from itertools import izip_longest as izip_lsum = [a+b for a,b in izip_l(arr1,arr2, fillvalue=0)]
【解决方案2】:
import numpy as np

def Add(a, b):
    a, b = map(np.array, (a, b))
    if a.size > b.size: 
        a[:b.size] += b
        return a
    else:
        b[:a.size] += a
        return b

示例用法:

>>> Add([1,2], [3])
array([ 4.,  2.])
>>> Add([0,0,0,2], _)
array([ 4.,  2.,  0.,  2.])

该函数的第一行用于将这些数组的副本转换为浮点数,因此您可以稍后进行除法而无需四舍五入。

【讨论】:

  • a, b = map(np.asfarray, (a, b)) 超级难读。为什么不简单地使用a = a.astype(float)b = b.astype(float)?还有,为什么Add 以后还要关心这个划分呢?如果他们决定需要一个部门,开发人员应该自己投给float
  • @NilsWerner,因为这对我来说看起来更简单、更干净(而且超级容易阅读),并且还需要少一行并产生相同的结果。
  • 您需要在文本中解释这一行这一事实表明,除了您之外,其他人实际上更难阅读。
  • @NilsWerner,它解释了必须先复制数组才能使用该方法。由 OP 决定如何复制它们。
【解决方案3】:

另一种解决方案:

def add_shortest(a, b):
    a = numpy.array(a)
    b = numpy.array(b)

    common_length = min(a.size, b.size)
    a[:common_length] += b[:common_length]
    return a

add_shortest(numpy.arange(2), numpy.arange(3))  # array([0, 2])
add_shortest(numpy.arange(3), numpy.arange(3))  # array([0, 2, 4])
add_shortest(numpy.arange(3), numpy.arange(2))  # array([0, 2, 2])
add_shortest(add_shortest([0, 0, 0, 2], add_shortest([1, 2], [3])), [3, 1])  # array([7, 3, 0, 2])

【讨论】:

  • 我认为这仅在您的最短矩阵是第一个参数时才有效 - 在这种情况下,我们不知道长度。
  • 我检查过,它在两种情况下都有效。你表达问题的方式听起来你总是想返回一个与参数a相同长度的数组。
猜你喜欢
  • 1970-01-01
  • 2020-11-20
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
相关资源
最近更新 更多