Python:当一个数组被转置时,numpy数组是否被链接?

时间:2016-01-22 11:12:56

标签: python arrays pointers numpy

目前我正在开发一个python脚本,它从文本文件中提取测量数据。我正在使用iPython Notebook和Python 2.7

现在,在使用numpy数组时,我遇到了一些奇怪的行为。我对此没有任何解释。

myArray = numpy.zeros((4,3))
myArrayTransposed = myArray.transpose()

for i in range(0,4):
    for j in range(0,3):
        myArray[i][j] = i+j

print myArray
print myArrayTransposed

导致:

[[ 0.  1.  2.]
 [ 1.  2.  3.]
 [ 2.  3.  4.]
 [ 3.  4.  5.]]
 [[ 0.  1.  2.  3.]
 [ 1.  2.  3.  4.]
 [ 2.  3.  4.  5.]]

因此,如果不处理转置数组,则会在此数组中更新值。

这怎么可能?

1 个答案:

答案 0 :(得分:4)

来自http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html

  

不同的ndarray可以共享相同的数据,因此在一个ndarray中所做的更改可能在另一个中可见。也就是说,ndarray可以是另一个ndarray的“视图”,它所指的数据由“base”ndarray处理。 ndarrays也可以是Python字符串或实现缓冲区或数组接口的对象所拥有的内存视图。

当你进行转置()时,会返回原始ndarray的“视图”。它指向相同的内存缓冲区,但它有不同的索引方案:

  

存储器段本质上是1维的,并且存在许多用于在1维块中布置N维阵列的项目的不同方案。 Numpy非常灵活,ndarray对象可以适应任何跨步索引方案。

要创建独立的ndarray,可以使用numpy.array()运算符:

myArrayTransposed = myArray.transpose().copy()