展平numpy数组

时间:2014-07-08 16:08:11

标签: python numpy flatten

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

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

在Python3中有一个inbuild函数flatten()用于

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

答案 2 :(得分:0)

ravel() 方法比所有方法都更有效率

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