目前我正在开发一个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.]]
因此,如果不处理转置数组,则会在此数组中更新值。
这怎么可能?
答案 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()