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

eng*_*ler 5 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
Run Code Online (Sandbox Code Playgroud)

造成:

[[ 0.  1.  2.]
 [ 1.  2.  3.]
 [ 2.  3.  4.]
 [ 3.  4.  5.]]
 [[ 0.  1.  2.  3.]
 [ 1.  2.  3.  4.]
 [ 2.  3.  4.  5.]]
Run Code Online (Sandbox Code Playgroud)

因此,无需处理转置数组,该数组中的值就会更新。

这怎么可能?

Adi*_*vin 4

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

\n\n
\n

不同的 ndarray 可以共享相同的数据,因此一个 ndarray 中所做的更改可能在另一个 ndarray 中可见。也就是说,一个 ndarray 可以是另一个 ndarray 的 \xe2\x80\x9cview\xe2\x80\x9d ,并且它引用的数据由 \xe2\x80\x9cbase\xe2\x80\x9d ndarray 处理。ndarray 还可以是 Python 字符串或实现缓冲区或数组接口的对象所拥有的内存的视图。

\n
\n\n

当您执行 transpose() 时,这将返回原始 ndarray 的“视图”。它指向相同的内存缓冲区,但具有不同的索引方案:

\n\n
\n

内存段本质上是一维的,并且有许多不同的方案用于将 N 维数组的项目排列在一维块中。Numpy 很灵活,ndarray 对象可以适应任何跨步索引方案。

\n
\n\n

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

\n\n
myArrayTransposed = myArray.transpose().copy()\n
Run Code Online (Sandbox Code Playgroud)\n

  • 也许“numpy.copy”函数会更明确地实现OP想要的:“myArrayTranspose = myArray.transpose().copy()” (2认同)