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. ]])