目前我正在研究一个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.]]
因此,在不处理转置数组的情况下,此数组中的值将更新。
这怎么可能?
从 http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html:
不同的 ndarray 可以共享相同的数据,因此在一个 ndarray 中所做的更改可能在另一个 ndarray 中可见。也就是说,一个ndarray可以是另一个ndarray的"视图",它所引用的数据由"基本"ndarray处理。ndarray 也可以是 Python 字符串或实现缓冲区或数组接口的对象拥有的内存视图。
当你做一个转置()时,这会返回一个"视图"到原始的ndarray。它指向相同的内存缓冲区,但它具有不同的索引方案:
一段内存本质上是一维的,并且有许多不同的方案可以在一维块中排列 N 维数组的项目。Numpy 非常灵活,ndarray 对象可以适应任何跨步索引方案。
要创建一个独立的 ndarray,你可以使用 numpy.array() 运算符:
myArrayTransposed = myArray.transpose().copy()