Numpy赋值给切片时,数组何时被复制?

10

因此,使用numpy数组将一个分配给另一个只会复制引用:

即:

import numpy as np
x = np.array([5,8])
y = x 
y += 1
x
Out: array([6, 9])

如果我需要一个深度复制,则应使用 x.copy()。当从更高维数组中获取视图时,情况也是如此,例如:

A=np.array([[4,10],[8,1]])
b=A[:,1]
b+=1
A
Out: array([[ 4, 11],
            [ 8,  2]])

反之亦然(继续上面的内容):

A[:,1]=b
b
Out: array([11,  2])
b+=1
A
Out: array([[ 4, 12],
            [ 8,  3]])

目前为止,一切都稳定运作。但现在如果我继续执行:

A[:,0] = b
A
Out: array([[12, 12],
            [ 3,  3]])
b
Out: array([12,  3])
b+=1
A
Out: array([[12, 13],
            [ 3,  4]])

我不明白的是为什么第一列保持不变,而其他列不是?为什么第二列继续指向b数组?是否有规则来决定何时对数组进行深拷贝赋值?

1
我不知道Python,但它看起来像C++指针。你可以将一个内存空间分配给多个变量(就像许多变量读取相同的内存指针),而不是将一个变量分配给多个内存空间(1个变量读取多个内存指针)。 - Vuwox
1个回答

8

When you are doing

b=A[:,1]

它正在创建对底层数组的引用。 但在这种情况下

A[:,0] = b

只有值会被复制。因此,在最后一个语句中,第一列保持不变,而仍由b引用的第二列发生了变化。 请参考这个链接


1
谢谢。当我执行 A[:,1]=b 后,这个引用不会被覆盖吗?感谢提供的链接,但是我发现 B[:]=A 也是一个引用,而不是一个独立的副本。 - jay--bee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接