Python 带元组的二维numpy数组:扩展为多个数组,并包含原始元组的组合
假设我有一个如下所示的NumPy数组:Python 带元组的二维numpy数组:扩展为多个数组,并包含原始元组的组合,python,numpy,Python,Numpy,假设我有一个如下所示的NumPy数组: 0 1 (2,3) (4,5) 6 7 9 (10,) 11 如何将其拆分为下面的数组列表?条件:在最终数组中并没有元组,并且每个数组包含元组元素的唯一组合。也就是说,原始数组中有两个元组,因此这些元素有4种不同的组合。下面的第一个数组具有原始数组的组合(2)和(4) 0 1 2 4 6 7 9 10 11 0 1 2 5 6 7 9 10 11 0 1 3 4 6 7 9 1
0 1 (2,3)
(4,5) 6 7
9 (10,) 11
如何将其拆分为下面的数组列表?条件:在最终数组中并没有元组,并且每个数组包含元组元素的唯一组合。也就是说,原始数组中有两个元组,因此这些元素有4种不同的组合。下面的第一个数组具有原始数组的组合(2)和(4)
0 1 2
4 6 7
9 10 11
0 1 2
5 6 7
9 10 11
0 1 3
4 6 7
9 10 11
0 1 3
5 6 7
9 10 11
正如@unutbu所说,这样的数据结构很尴尬。但如果你想这样做,这是可行的:
In [52]:
A
Out[52]:
array([[0, 1, (2, 3)],
[(4, 5), 6, 7],
[9, (10,), 11]], dtype=object)
In [53]:
import itertools
AR=A.ravel()
AT=[i for i, val in enumerate(AAR) if isinstance(val, tuple)]
for item in itertools.product(*AR[AT]):
B=AR.copy()
B[AT]=item
print B.reshape(A.shape)
[[0 1 2]
[4 6 7]
[9 10 11]]
[[0 1 2]
[5 6 7]
[9 10 11]]
[[0 1 3]
[4 6 7]
[9 10 11]]
[[0 1 3]
[5 6 7]
[9 10 11]]
我们能在问题发展到这个阶段之前解决它吗?原始数组是如何创建的?原始数组是通过在字典中查找数组元素(w/任意长度值)创建的,这解释了元组在不方便的地方。我将尝试按照您的建议重构代码。如果您在每个位置生成一个元组,那么您可以将元组序列传递给
itertools.product
,这样就可以相当干净地生成最终结果。