【问题标题】:Python numpy array of numpy arrays as objectPython numpy 数组的 numpy 数组作为对象
【发布时间】:2022-01-26 10:26:19
【问题描述】:

我有一些 np 数组。我想将它们连接为 np 数组中的对象。

 coords1 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
 coords2 = np.array([[13, 14, 15, 16], [17, 18, 19, 20]])

我想获取 coordsAll

 coordsAll = [[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]],
             [[13, 14, 15, 16], [17, 18, 19, 20]]]

这是我的代码:

 coords1 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
 coords2 = np.array([[13, 14, 15, 16], [17, 18, 19, 20]])
 coordsAll = np.empty(np.array(np.array((0, 4), int)), object)
 coordsAll = np.append (coordsAll, coords1, axis=0)
 coordsAll = np.append(coordsAll, coords2, axis=0)

coordsAll 现在

 [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20]]

但我希望输出数组中有两个对象,例如

 [[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], [[13, 14, 15, 16], [17, 18, 19, 20]]]

非常感谢。

【问题讨论】:

    标签: python arrays numpy object


    【解决方案1】:

    也许是这样的:

    coordsAll = np.array([coords2, coords1], dtype=object)
    print(coordsAll)
    print(coordsAll.dtype)
    

    【讨论】:

    • 我们如何循环执行此操作?对于 coordsAll = np.array([coordsAll, coords[i]], dtype=object) 这不起作用
    • 所以,遍历 coords 变量值,然后将它们添加到列表中并返回到 np.array (list, dtype = 'object') ?
    【解决方案2】:
    In [457]: coordsAll
    Out[457]: 
    array([[1, 2, 3, 4],
           [5, 6, 7, 8],
           [9, 10, 11, 12],
           [13, 14, 15, 16],
           [17, 18, 19, 20]], dtype=object)
    

    您重复使用np.append 将 (0,4) 和 (3,4) 连接成 (3,4),然后添加 (2,4),得到 (5,4) .指定 object dtype 不会改变这种行为。你不妨这样做:

    In [458]: np.concatenate((coords1, coords2), axis=0)
    Out[458]: 
    array([[ 1,  2,  3,  4],
           [ 5,  6,  7,  8],
           [ 9, 10, 11, 12],
           [13, 14, 15, 16],
           [17, 18, 19, 20]])
    

    concatenate 获取整个数组列表。循环中的重复调用是低效的。另外,您必须先制作那个奇怪的 (0,4) 数组。对列表操作建模数组操作不是一个好主意。

    制作所需大小的对象数组最安全的方法是初始化它,然后填充:

    In [459]: res = np.empty(2, object)
    In [460]: res
    Out[460]: array([None, None], dtype=object)
    In [461]: res[0] = coords1
    In [462]: res[1] = coords2
    In [463]: res
    Out[463]: 
    array([array([[ 1,  2,  3,  4],
                  [ 5,  6,  7,  8],
                  [ 9, 10, 11, 12]]), array([[13, 14, 15, 16],
                                             [17, 18, 19, 20]])], dtype=object)
    

    np.arrayobject dtype 也适用于这种情况,但可能会因其他形状组合而失败:

    In [464]: np.array((coords1, coords2), object)
    Out[464]: 
    array([array([[ 1,  2,  3,  4],
                  [ 5,  6,  7,  8],
                  [ 9, 10, 11, 12]]), array([[13, 14, 15, 16],
                                             [17, 18, 19, 20]])], dtype=object)
    

    相同形状的数组产生一个 3d 数组:

    In [465]: np.array((coords1, coords1), object)
    Out[465]: 
    array([[[1, 2, 3, 4],
            [5, 6, 7, 8],
            [9, 10, 11, 12]],
    
           [[1, 2, 3, 4],
            [5, 6, 7, 8],
            [9, 10, 11, 12]]], dtype=object)
    

    and (4,3) with (4,2) 产生错误:

    In [466]: np.array((coords1.T, coords2.T), object)
    Traceback (most recent call last):
      File "<ipython-input-466-dff6d2a13fa4>", line 1, in <module>
        np.array((coords1.T, coords2.T), object)
    ValueError: could not broadcast input array from shape (4,3) into shape (4,)
    

    请记住,您想要的数组不是“正常”ndarray。它更接近于简单列表[coords1, coords2],几乎没有Out[458] 的多维优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多