Python 展平数组的元组数组

Python 展平数组的元组数组,python,arrays,numpy,Python,Arrays,Numpy,我对numpy和数组的处理非常陌生,我遇到了以下问题。我有一个数组,看起来像这样: [ (float, array([ float]), array([ float, float]), int, int, float) ... ] i、 在我看来,数组的每个元素都是一个元组,包含float、int和float数组的混合体。我想知道1)如何去掉元组中出现的数组结构,只保留第一个索引,2)最有效的方法是什么 例如,如果第一个元组是: (1.2, array([ 0.03]), array([

我对
numpy
和数组的处理非常陌生,我遇到了以下问题。我有一个数组,看起来像这样:

[ (float, array([ float]), array([ float, float]), int, int, float)
  ... ]
i、 在我看来,数组的每个元素都是一个元组,包含float、int和float数组的混合体。我想知道1)如何去掉元组中出现的数组结构,只保留第一个索引,2)最有效的方法是什么

例如,如果第一个元组是:

(1.2, array([ 0.03]), array([ 1.8, 2.1]), 2, 4, 2.)
我想得到:

(1.2, 0.03, 1.8, 2, 4, 2.)

有什么建议吗?

这是使用
itertools.chain
的一种方法。假设项目是标量或
numpy
数组

import numpy as np
from itertools import chain

tup = [(1.2, np.array([ 0.03]), np.array([ 1.8, 2.1]), 2, 4, 2.),
       (5.2, np.array([ 0.345]), np.array([ 11.8, 25.1]), 7, 1, 12.)]

res = list(chain.from_iterable(chain.from_iterable(i.tolist() \
           if isinstance(i, np.ndarray) else [i] for i in j) for j in tup))

# [1.2, 0.03, 1.8, 2.1, 2, 4, 2.0, 5.2, 0.345, 11.8, 25.1, 7, 1, 12.0]

构造类似的结构化数组:

In [333]: dt=[('var1', '<f4'), ('var2', 'O'), ('var3', 'O'), ('var4', '<i4')]
In [334]: arr = np.zeros(3, dt)
In [335]: arr
Out[335]: 
array([(0., 0, 0, 0), (0., 0, 0, 0), (0., 0, 0, 0)],
      dtype=[('var1', '<f4'), ('var2', 'O'), ('var3', 'O'), ('var4', '<i4')])
对于更简单的结构化数据类型,
np.array(arr.tolist())
通常有效,因为
np.array
会尝试创建多维数组(如果可能的话)。但在这里,第一个元素是浮点,第二个是数组:

In [341]: np.array(_)
ValueError: setting an array element with a sequence.
In [364]: def foo(item):
     ...:     try:
     ...:         return item[0]
     ...:     except:
     ...:         return item
     ...:     
我们可以从该列表中创建一个对象数据类型数组,但这仍然无法解压缩内部数组:

In [340]: arr.tolist()
Out[340]: 
[(1.2000000476837158, array([0.03]), array([1.8, 2.1]), 2),
 (1.2000000476837158, array([0.03]), array([1.8, 2.1]), 2),
 (1.2000000476837158, array([0.03]), array([1.8, 2.1]), 2)]
In [342]: np.array(arr.tolist(),object)
Out[342]: 
array([[1.2000000476837158, array([0.03]), array([1.8, 2.1]), 2],
       [1.2000000476837158, array([0.03]), array([1.8, 2.1]), 2],
       [1.2000000476837158, array([0.03]), array([1.8, 2.1]), 2]],
      dtype=object)
我可以使用以下方法解包“var2”字段:

In [345]: arr['var2'].astype(float)
Out[345]: array([0.03, 0.03, 0.03])
In [346]: arr['var2'][:] = _
In [347]: arr
Out[347]: 
array([(1.2, 0.03, array([1.8, 2.1]), 2),
       (1.2, 0.03, array([1.8, 2.1]), 2),
       (1.2, 0.03, array([1.8, 2.1]), 2)],
      dtype=[('var1', '<f4'), ('var2', 'O'), ('var3', 'O'), ('var4', '<i4')])
现在在元组上迭代,并在元组内迭代:

In [365]: [[foo(item) for item in a] for a in arr]
Out[365]: [[1.2, 0.03, 1.8, 2], [1.2, 0.03, 1.8, 2], [1.2, 0.03, 1.8, 2]]
如果需要,请将其转换回阵列:

In [366]: np.array(_)
Out[366]: 
array([[1.20000005, 0.03      , 1.8       , 2.        ],
       [1.20000005, 0.03      , 1.8       , 2.        ],
       [1.20000005, 0.03      , 1.8       , 2.        ]])

这个数组的
形状和
数据类型是什么?您是如何生成此数组的?@Prune,现在将其标记为副本还为时过早。我们不知道这个数组的数据类型。这是对象数据类型吗?结构化数组?很好。重新开放;结束投票更合适。正如我所说的,我对这个很陌生,所以我不太清楚你的意思。。。键入
myarray.dtype
,我得到如下结果:
numpy.record,[('var1','OK,这是一个结构化数组(实际上是
record
子类,但实际上是相同的),其中两个字段是对象数据类型。我必须构造类似的内容,并尝试各种方法将其展平。这并不容易。谢谢提示:)你会如何循环和重写数组本身呢?不确定你的意思。结果是一个列表。我的意思是你调用
tup
这里是numpy数组中许多元组中的一个。我能把每个元组作为数组的索引来操作吗?或者用迭代器可以做些什么吗?@Demosthene,你可以“链接链”,请参阅更新。非常感谢!如何保持数据类型结构的原样,但确保所有
object
元素都成为浮点数?
In [364]: def foo(item):
     ...:     try:
     ...:         return item[0]
     ...:     except:
     ...:         return item
     ...:     
In [365]: [[foo(item) for item in a] for a in arr]
Out[365]: [[1.2, 0.03, 1.8, 2], [1.2, 0.03, 1.8, 2], [1.2, 0.03, 1.8, 2]]
In [366]: np.array(_)
Out[366]: 
array([[1.20000005, 0.03      , 1.8       , 2.        ],
       [1.20000005, 0.03      , 1.8       , 2.        ],
       [1.20000005, 0.03      , 1.8       , 2.        ]])