扁平化numpy数组

1 投票
3 回答
5347 浏览
提问于 2025-04-18 12:31

我有以下三个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。

我在这里找到了一种技巧(连接内部列表或整数):

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

但是这个方法对数组c不管用。

3 个回答

0

ravel() 方法比其他所有方法都更高效

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

在Python3中,有一个内置的函数叫做flatten(),可以用来处理这个问题。

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

对于那些不需要处理嵌套的情况,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))

撰写回答