【发布时间】:2016-10-22 19:51:04
【问题描述】:
我有多个 numpy 掩码数组 arr0, arr1, ..., arrn。
我将它们放入列表arrs = [arr0, ..., arrn]。
我想展平这些阵列并在它们上面放置一个遮罩。我做了类似的事情:
for arr in arrs:
arr = np.ravel(arr)
arr[mask] = ma.masked
我不明白 Python 何时进行复制,何时它只是一个指针。这个for 循环不会展平arr0, ..., arrn,(而ravel 输出的是视图而不是副本)它只是展平了变量arr,尽管它确实改变了它们的掩码!
据我了解,arr 是列表arrs 中元素的视图,因此当我更改arr 的元素时,它会更改列表中相应数组的元素。但是当我为arr 分配一个新值时,它不会改变原始数组,即使分配应该是这个数组的一个视图。为什么?
举例编辑:
要展平的数组:
arr0 = masked_array(data=[[1,2],[3,4]], mask=False)
arr1 = masked_array(data=[[5,6],[7,8]], mask=False)
mask = [[False,True],[True,False]]
预期输出:
arr0 = masked_array(data=[[1,--],[--,4]], mask=[[False,True],[True,False]])
arr1 = masked_array(data=[[5,--],[--,8]], mask=[[False,True],[True,False]])
我想在循环中执行此操作,因为我有很多数组(或多或少 15 个),并且我想在代码中使用数组名称。有没有别的办法:
arr0 = np.ravel(arr0)
...
arrn = np.ravel(arrn)
【问题讨论】:
-
您能否添加一个数字示例来说明您要实现的目标?
-
问题出在列表迭代器上。你不能在循环中分配它。
-
arr = np.ravel(arr)为arr创建一个新的(扁平化)视图,并重新分配名称 arr 以指向该创建的视图。简单的分配只是reassigns names to point to something。正如您所指出的,ravel()创建了一个视图,因此arr[mask] = ma.masked也确实修改了原始视图。 -
赋值和变异是不同的操作。变量始终只是引用。为新值分配名称总是只会更改引用所指的内容,而不是原始值。
标签: python arrays numpy view flatten