普通python列表和numpy数组对象之间的不同行为

时间:2018-02-21 23:48:29

标签: python python-3.x numpy

直截了当。接下来的语句具有交换python 2D列表的两个列表元素的内容的效果:

a = [[1,2,3],
     [4,5,6]]
b = [[7,8,9],
     [10,11,12]]

tmp = a[1]
a[1] = b[1]
b[1] = tmp

输出:

a = [[1,2,3],
     [10,11,12]]

b = [[7,8,9],
     [4,5,6]]

对于numpy数组类型,这不会发生。

a = np.array([[1,2,3],
              [4,5,6]])
b = np.array([[7,8,9],
              [10,11,12]])

tmp = a[1]
a[1] = b[1]
b[1] = tmp

输出:

a = array([[ 1,  2,  3],
           [10, 11, 12]])

b = array([[ 7,  8,  9],
           [10, 11, 12]])

为什么会这样?

1 个答案:

答案 0 :(得分:3)

列表列表是嵌套对象。 NumPy数组不是嵌套的,而是2D。 2D列表没有概念。所以你在列表中有一个列表。而在NumPy中,它只是一个对象。

NumPy总是在索引时返回一个视图,索引的结果是另一个数组。你需要制作明确的副本:

tmp = a[1].copy()
a[1] = b[1].copy()
b[1] = tmp

让它换掉:

>>> a
array([[ 1,  2,  3],
       [10, 11, 12]])
>>> b
array([[7, 8, 9],
       [4, 5, 6]])

经验法则:

  1. 列表中的列表索引==对子列表的引用
  2. 沿第一维==视图索引NumPy 2D数组,即共享数据