gpt4 book ai didi

python - 展平数组元组的数组

转载 作者:行者123 更新时间:2023-12-01 02:00:57 24 4
gpt4 key购买 nike

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

[ (float, array([ float]), array([ float, float]), int, int, float)
... ]

即在我看来,数组的每个元素都是一个元组,包含 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.)

有什么建议吗?

最佳答案

构造类似的结构化数组:

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

用数据填充它(现在是相同的副本):

In [336]: arr[0]=(1.2, np.array([.03]),np.array([1.8,2.1]),2)
In [337]: arr[1]=(1.2, np.array([.03]),np.array([1.8,2.1]),2)
In [338]: arr[2]=(1.2, np.array([.03]),np.array([1.8,2.1]),2)
In [339]: arr
Out[339]:
array([(1.2, array([0.03]), array([1.8, 2.1]), 2),
(1.2, array([0.03]), array([1.8, 2.1]), 2),
(1.2, array([0.03]), array([1.8, 2.1]), 2)],
dtype=[('var1', '<f4'), ('var2', 'O'), ('var3', 'O'), ('var4', '<i4')])

tolist 不会删除或展平内部数组:

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

对于更简单的结构化数据类型,np.array(arr.tolist()) 通常可以工作,因为 np.array 会尝试创建多维数组(如果可以的话)。但这里第一个元素是 float ,但第二个元素是数组:

In [341]: np.array(_)
ValueError: setting an array element with a sequence.

我们可以从该列表中创建一个对象数据类型数组 - 但这仍然无法解压内部数组:

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

但这不适用于“var3”字段。但如果您只想要每个“var3”数组的第一个元素:

In [353]: arr['var3']
Out[353]:
array([array([1.8, 2.1]), array([1.8, 2.1]), array([1.8, 2.1])],
dtype=object)

In [355]: np.stack(arr['var3']) # only works if all have the same length
Out[355]:
array([[1.8, 2.1],
[1.8, 2.1],
[1.8, 2.1]])
In [356]: np.stack(arr['var3'])[:,0]
Out[356]: array([1.8, 1.8, 1.8])
In [357]: arr['var3']=_
In [358]: arr
Out[358]:
array([(1.2, 0.03, 1.8, 2), (1.2, 0.03, 1.8, 2), (1.2, 0.03, 1.8, 2)],
dtype=[('var1', '<f4'), ('var2', 'O'), ('var3', 'O'), ('var4', '<i4')])
In [359]: np.array(arr.tolist())
Out[359]:
array([[1.20000005, 0.03 , 1.8 , 2. ],
[1.20000005, 0.03 , 1.8 , 2. ],
[1.20000005, 0.03 , 1.8 , 2. ]])
<小时/>

也许最好将此数组视为元组列表,并迭代处理它。

首先,概括数组的元素:

In [360]: arr[0]=(1.2, np.array([.03]),np.array([1.8,2.1]),2)
In [361]: arr[1]=(1.2, np.array([.03,.4]),np.array([1.8,2.1,.2]),2)
In [362]: arr[2]=(1.2, np.array([.03,.4]),np.array([1.8]),2)
In [363]: arr
Out[363]:
array([(1.2, array([0.03]), array([1.8, 2.1]), 2),
(1.2, array([0.03, 0.4 ]), array([1.8, 2.1, 0.2]), 2),
(1.2, array([0.03, 0.4 ]), array([1.8]), 2)],
dtype=[('var1', '<f4'), ('var2', 'O'), ('var3', 'O'), ('var4', '<i4')])

定义一个辅助函数来提取数组的第一个元素:

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

关于python - 展平数组元组的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49635509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com