【问题标题】:2-D numpy array with tuples: expanding into multiple arrays w/combinations of original tuples具有元组的二维 numpy 数组:扩展为具有原始元组组合的多个数组
【发布时间】:2014-03-28 18:43:18
【问题描述】:

假设我有一个如下所示的 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  10 11

0  1  3
5  6  7
9  10 11

【问题讨论】:

  • 我们能否在问题发展到这个阶段之前尝试解决问题?原始数组是如何创建的?
  • 原始数组是通过在字典中查找数组元素(w/任意长度值)创建的,这解释了尴尬地方的元组。我会按照你的建议尝试重构代码。
  • 如果您在每个位置生成一个元组,那么您可以将元组序列传递给itertools.product,这样就可以相当干净地生成最终结果。

标签: python numpy


【解决方案1】:

正如@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]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 2019-01-09
    • 2012-03-04
    • 1970-01-01
    • 2018-09-20
    • 2013-07-18
    • 2023-02-03
    相关资源
    最近更新 更多