扁平化numpy数组
我有以下三个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))