我有一种奇怪的行为,试图改变今天numpy数组元素的值,我想理解为什么它不起作用。我有两个数组(a
和b
),我想更改b的值,其中a> 0
a = array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
b = array([[ 5., 0., 0.],
[ 0., 5., 0.],
[ 0., 0., 5.]])
mask = a > 0
print b[mask][0]
=> 5.0
b[mask][0] = 10
print b[mask][0]
=> 5.0
有人可以解释为什么作业b [mask] [0]没有改变我的值5.0?
答案 0 :(得分:2)
b[mask]
是b
的副本。 b[mask][0] = 1
实际上是:
c = b[mask]
c[0] = 1
c
的数据元素(通常)不是b
元素的连续块。
b[mask] = 10
b[mask] = [10, 11, 12]
如果值是左侧的唯一内容,您可以将值分配给b[mask]
。您需要更改所有蒙版元素。
如果您需要更改一个或两个,请先更改遮罩,使其仅选择这些元素。
一般
b[...][...] = ...
不是好习惯。有时它可以工作(如果第一个索引是一个产生view
的切片),但你不应该指望它。完全掌握视图和副本之间的区别需要一段时间。
Python解释器将[]
翻译为对__getitem__
或__setitem__
的调用。以下对是等价的:
c = b[mask]
c = b.__getitem__(mask)
b[mask] = 10
b.__setitem__(mask, 10)
b[mask][0] = 10
b.__getitem__(mask).__setitem__(0, 10)
b[mask][10]
是2个操作,后跟一个get。该集合对get的结果进行操作。仅当get的结果是视图时,它才会修改b
。