代码之家  ›  专栏  ›  技术社区  ›  massphoenix

不一致维度对象上的numpy ravel

  •  0
  • massphoenix  · 技术社区  · 7 年前

    我有下面的代码,它允许我迭代一个平坦的列表,并将更新映射回结构化数组-

    a = np.asarray([1,2,3])
    b = np.asarray([4,5,6])
    c = np.asarray([a, b])
    print c
    r = c.ravel()
    print r
    r[1] = 10
    print c
    

    设置r[1]=10将c[0][1]修改为10。我想对下面的代码段做一些类似的事情,但这失败了,我假设这是因为维度不一致。有没有什么方法可以获得类似的行为,这样我就可以修改一个平坦的版本,而不必将其重新整形为c?

    a = np.asarray([1,2,3])
    b = np.asarray([4,5,6,7,8])
    c = np.asarray([a, b])
    
    r = c.ravel()
    r[1] = 10
    print r
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   hpaulj    7 年前

    在你的第一个案例中 c 是2d阵列

    In [391]: a = np.asarray([1,2,3])
         ...: b = np.asarray([4,5,6])
         ...: c = np.asarray([a, b])
         ...: 
    In [392]: c
    Out[392]: 
    array([[1, 2, 3],
           [4, 5, 6]])
    In [393]: c.shape
    Out[393]: (2, 3)
    

    ravel c ,因此对其中一个的更改将显示在另一个中

    In [394]: r = c.ravel()
    In [395]: r[1] = 10
    In [396]: c
    Out[396]: 
    array([[ 1, 10,  3],
           [ 4,  5,  6]])
    

    您还可以索引 具有 flat ,具有相同的效果:

    In [397]: c.flat[4] = 10
    In [398]: c
    Out[398]: 
    array([[ 1, 10,  3],
           [ 4, 10,  6]])
    In [399]: r
    Out[399]: array([ 1, 10,  3,  4, 10,  6])
    

    这些更改 c r 不影响原件 a b asarray 复制这些阵列。

    在第二种情况下

    In [400]: a = np.asarray([1,2,3])
         ...: b = np.asarray([4,5,6,7,8])
         ...: c = np.asarray([a, b])
         ...: 
    In [401]: c
    Out[401]: array([array([1, 2, 3]), array([4, 5, 6, 7, 8])], dtype=object)
    

    这些碎片可以连接成1d阵列:

    In [402]: np.concatenate(c)
    Out[402]: array([1, 2, 3, 4, 5, 6, 7, 8])
    

    值可以更改,但不会影响原始值 c .

    In [403]: c[0][0] = 10
    In [404]: c
    Out[404]: array([array([10,  2,  3]), array([4, 5, 6, 7, 8])], dtype=object)
    

    因为 c ,而不是其副本:

    In [405]: a                     
    Out[405]: array([10,  2,  3]
    

    np.array A阵列 )尽量从输入中生成一个维度数组。在第一种情况下,输入大小相等,因此它生成2d。在第二种情况下,它们不同,因此形成了一个一维对象阵列。这种行为经常给用户带来问题。在第二种情况下,他们要么期望使用2d数组,要么在第一种情况下无法生成对象数组。

    In [417]: g = np.empty(2, dtype=object)
    In [418]: g[:] = [a, b[:3]]
    In [419]: g
    Out[419]: array([array([10,  2,  3]), array([4, 5, 6])], dtype=object)