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