【问题标题】:Turn array into array of arrays following structure of another array按照另一个数组的结构将数组转换为数组数组
【发布时间】:2016-06-19 21:37:15
【问题描述】:

我想将一个数组转换为一个数组数组,然后是另一个数组数组。我不知道该怎么做,这里是数组:

orig_array = [[0,1],[4],[3],[],[3,2,6],[]]
my_array = [2,0,1,3,3,4,5]

wanted_array = [[2,0],[1],[3],[],[3,4,5],[]]

我想保留空数组。

谢谢

【问题讨论】:

  • numpy 标签的意义是什么?看起来你有清单;列表列表,但仍然列出。即使orig_array是一个numpy数组,它也是对象类型,基本上是一个列表。
  • @user2520932 如果以下答案之一对您有所帮助,请考虑将其标记为已接受。这将为回答者提供声誉(使回答值得他们花时间),同时表明您的问题已经得到回答。在我们这样做的同时:您还应该考虑对您认为有用的问题和答案进行投票。

标签: arrays python-2.7 numpy


【解决方案1】:

获取orig_array 中每个元素的长度,沿长度值执行累积求和,得到my_array 需要拆分的索引,最后使用np.split 实际执行拆分。因此,实现看起来像这样 -

lens = [len(item) for item in orig_array]
out = np.split(my_array,np.cumsum(lens))[:-1]

示例运行 -

In [72]: orig_array = np.array([[0,1],[4],[3],[],[3,2,6],[]])
    ...: my_array = np.array([2,0,1,3,3,4,5])
    ...: 

In [73]: lens = [len(item) for item in orig_array]
    ...: out = np.split(my_array,np.cumsum(lens))[:-1]
    ...: 

In [74]: out
Out[74]: 
[array([2, 0]),
 array([1]),
 array([3]),
 array([], dtype=int64),
 array([3, 4, 5]),
 array([], dtype=int64)]

【讨论】:

  • @MartinHallén my_array 仅用于从中提取元素。所以,不应该依赖它是否排序。
  • 抱歉,为了更好地反映实际的 my_array,已编辑问题
  • 你是对的。需要 numpy,但很好的解决方案。有我的支持:)
  • @user2520932 编辑示例运行以展示它的使用情况。
【解决方案2】:
def do(format, values):
    if type(format) == list:
        return [do(v, values) for v in format]
    else:
        return values.pop(0)

print do(orig_array, my_array)

注意:这会破坏值来自的数组。

【讨论】:

    【解决方案3】:

    您可以执行以下操作:

    import copy
    
    def reflect_array(orig_array, order):
        wanted_array = copy.deepcopy(orig_array)
        for i, part_list in enumerate(orig_array):
            for j, _ in enumerate(part_list):
                wanted_array[i][j] = order.pop()
        return wanted_array
    

    试运行:

    orig_array = [[0,1],[4],[3],[],[3,2,6],[]]
    my_array = [2,0,1,3,3,4,5]
    
    print reflect_array(orig_array, my_array)
    # [[2, 0], [1], [3], [], [3, 4, 5], []]
    

    【讨论】:

      【解决方案4】:
      In [858]: my_array = [2,0,1,3,3,4,5]
      
      In [859]: [[my_array.pop(0) for _ in range(len(x))] for x in orig_array]
      Out[859]: [[2, 0], [1], [3], [], [3, 4, 5], []]
      

      如果您不想更改my_array,请使用b=my_array[:]

      这与@karoly's回答的原理相同;只是更直接,因为它假设只有一层嵌套。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 1970-01-01
        • 2021-05-02
        • 2022-06-17
        • 1970-01-01
        相关资源
        最近更新 更多