【问题标题】:Flattening a numpy array展平一个numpy数组
【发布时间】:2023-09-10 07:17:01
【问题描述】:

我有以下三个 numpy 数组:

a = np.array([ 1, 2, 3, 4, 2, 3, 4 ])
b = np.array([ [1], [2,3,4], [], [2,3,4] ])
c = np.array([ 1, [2,[3,4]], [], [2,3,4] ])

如何使用单个函数 f 来处理所有三个数组,以不变的顺序和不变的类型返回所有​​子列表中的值?

所以答案应该是 f(a) == f(b) == f(c) == a。

我在这里发现了以下技巧 (Concatenation of inner lists or ints):

def f(b):
    np.array([a for x in np_array for a in (x if isinstance(x, list) else [x])])

但这不适用于数组 c。

【问题讨论】:

  • 可能是错字?您需要 def f(b) 中的 return 语句。
  • 确实有一些拼写错误:缺少返回语句,并且 c = np.array([ [1], [2,[3,4]], [], [2,3,4] ])
  • 如果你不关心元素比较,那么你可以实现类似这个生成器解决方案:*.com/a/2158532/1634191

标签: python numpy flatten


【解决方案1】:

对于那些不需要处理嵌套的人,ndarray.flatten 可以解决问题。

对于您的用例,我不知道 numpy 解决方案,但这里有一个纯 python 替代方案:

>>> b = np.array([ [1], [2,3,4], [], [2,3,4] ])
>>> from compiler.ast import flatten
>>> np.array(flatten(b))
array([1, 2, 3, 4, 2, 3, 4])

它只适用于 python 2。

对于 python 3 试试这个:

from collections import Iterable

def flatten(collection):
  for element in collection:
    if isinstance(element, Iterable) and not isinstance(element, str):
      for x in flatten(element):
        yield x
    else:
      yield element

def flatten_array(array):
    return np.array(flatten(array))

【讨论】:

  • 感谢生成器的解决方案。但是,它似乎不起作用。它永远不会在集合循环中输入 for 元素(我在其中放置了一个打印语句,我看不到它)。我应该以某种迭代方式调用 flatten 生成器吗?这是怎么做到的?
【解决方案2】:

在 Python3 中有一个内置函数 flatten()

import numpy as np
arr=np.array([[4,7,-6],[3,0,8],[2,0,-4]])
print(arr)
print(arr.flatten())

【讨论】:

    【解决方案3】:

    ravel()方法比所有方法都高效

    import numpy as np
    a = np.array([[1,2,3],[4,5,6]])
    print(a.ravel())# flattened array
    

    【讨论】: