【问题标题】:How to substract multidimensional array in Python?如何在 Python 中减去多维数组?
【发布时间】:2014-04-13 02:54:33
【问题描述】:

我有这个多维数组:

n = [[1], [2], [3], [4], [5], [6], [7, 10], [8], [9], [7, 10]]

我想用 1 减去所有这些。所以结果将是:

result = [[0], [1], [2], [3], [4], [5], [6, 9], [7], [8], [6, 9]]

【问题讨论】:

  • 考虑获取NumPy。它比使用列表的列表做得更好。
  • @user2357112 Numpy 通常很好,但对于这种特殊情况并不能真正起作用——因为嵌套列表的长度不同,np.array(n) 给出了一个 dtype=object 而不是 int 的数组,所以 np.array(n) - 1 是一个 TypeError (如果它们的大小相同,那将是正确的答案)。

标签: python multidimensional-array


【解决方案1】:

如果您确定有一个列表列表,请使用嵌套列表推导:

In [13]: result = [[e-1 for e in i] for i in n]

In [14]: print result
[[0], [1], [2], [3], [4], [5], [6, 9], [7], [8], [6, 9]]

【讨论】:

    【解决方案2】:
    for x in n:
        for i, y in enumerate(x):
            x[i] = y - 1
    

    这更有效,至少在空间上。

    或者,如果您想像 zhangxaochen 那样使用嵌套列表推导,但将其分配给相同的值,以便它就地执行:

    n[:] = [[b - 1 for b in a] for a in n]
    

    请注意,这实际上仍然会创建两个额外的列表,因此它具有与将其分配给新数组相同的空间复杂度。

    【讨论】:

      【解决方案3】:
      result=n
      for a in range(len(n)):
          for b in range(len(n[a])):
              result[a][b]=n[a][b]-1
      

      【讨论】:

      • result=n 只是使其余部分与分配给n 相同。大概您的意思是结果应该是 n 的深层副本,它必须是 result = [m[:] for m in n]
      【解决方案4】:

      或者你可以使用map():

      >>> import operator
      >>> n = [[1], [2], [3], [4], [5], [6], [7, 10], [8], [9], [7, 10]]
      >>> map(lambda x: map(lambda y: operator.sub(y, 1), x), n)
      [[0], [1], [2], [3], [4], [5], [6, 9], [7], [8], [6, 9]]
      

      【讨论】:

        【解决方案5】:
        def difference(a, n):
            try:
                return a - n
            except TypeError:
                return [difference(i, n) for i in a]
        
        >>> difference([[1], [2], [3], [4], [5], [6], [7, 10], [8], [9], [7, 10]], 1)
        [[0], [1], [2], [3], [4], [5], [6, 9], [7], [8], [6, 9]]
        >>> difference([3, [1, 9, [1, 2, [3, 4, [5, 6]]]], [2], [[3, 4], [5, 6]], [3], [7, 10]], 1)
        [2, [0, 8, [0, 1, [2, 3, [4, 5]]]], [1], [[2, 3], [4, 5]], [2], [6, 9]]
        

        它适用于所有多维列表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-28
          • 1970-01-01
          • 2016-07-07
          • 1970-01-01
          • 1970-01-01
          • 2011-06-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多