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

数组与标量中的python赋值

  •  1
  • Physicist  · 技术社区  · 6 年前

    我有一个2D阵列 A 形状的 (4,3) ,以及1D阵列 a 形状的 (4,) . 我想交换前两行 A. ,以及 . 我做了以下工作:

    A[0,:],A[1,:] = A[1,:],A[0,:]
    a[0],a[1] = a[1],a[0]
    

    显然,它对 ,但失败 A. . 现在,第二行变为第一行,但第一行保持不变。如果我执行以下操作:

    first_row_copy = A[0,:].copy()
    A[0,:] = A[1,:]
    A[1,:] = first_row_copy
    

    然后,它似乎奏效了。为什么第一种方法不起作用?(但适用于 )还有,两者的区别是什么 A_copy = A[0,:].copy() A_copy = A[0,:] ?

    1 回复  |  直到 6 年前
        1
  •  5
  •   ShadowRanger    6 年前

    numpy 切片是 意见 默认情况下,它们不会创建独立的拷贝(这是一种性能/内存优化)。因此:

    A[0,:],A[1,:] = A[1,:],A[0,:]
    

    查看 A[1,:] 以及 A[0,:] ,然后指定 A[0,:] 等于所看到的 A[1,:] . 但当它开始分配 A[1,:] , A[0,:] 的视图现在显示复制后数据,因此您得到的结果不正确。只需添加 .copy 在这种情况下,这里的第二个元素就足够了:

    A[0,:], A[1,:] = A[1,:], A[0,:].copy()
    

    因为右侧的元组总是在左侧的赋值开始之前完全构建,所以您可以在第一次赋值时使用实时视图,只需制作副本即可保留第二次赋值的值。

    推荐文章