【发布时间】:2018-04-05 18:20:09
【问题描述】:
我使用 scipy 和 imread() 将图像导入为 RGB。假设我想分离出“R”组件并将其复制到内存中的新对象。下面的代码有效:
import scipy as sp
import scipy.misc as misc
import matplotlib.pyplot as plt
%matplotlib inline
pic = misc.imread("ARBITRARY IMAGE.png");
r = pic[:,:,0].copy()
r[0,0] = 0
print(r[0,0])
print(pic[0,0,0])
输出预期:
0
255
但是我通过以下路径到达那里,我不知道为什么它们不起作用:
r = pic[:,:,0]
r[0,0] = 0
print(r[0,0])
print(pic[0,0,0])
输出:
0
0
很公平,我从here 中获得了语法提示,它涉及使用像b = a[:] 这样的切片而不是单层。怎么样:
r = pic[:]
r[0,0,0] = 0
print(r[0,0,0])
print(pic[0,0,0])
或添加一个额外的步骤:
r = pic[:]
r= r[:,:,0]
r[0,0] = 0
print(r[0,0])
print(pic[0,0,0])
仍然输出:
0
0
它是一个数组而不是一个列表,但数组的this answer 暗示这种语法应该没问题。基本上,当我在示例中使用切片符号时,为什么没有在内存中创建新对象?我假设我错过了其他东西,我的谷歌搜索似乎告诉我语法应该有效。感谢您的帮助!
【问题讨论】:
-
变量
pic可能不是一个普通的数组,而是一些带有重载切片运算符的对象,它不会创建副本,而是引用相同数据的视图。例如。如果我没记错的话,numpy 也不喜欢创建副本。