Numpy在屏蔽后不会更改数组元素的值

时间:2015-08-14 03:22:21

标签: python arrays numpy

我有一种奇怪的行为,试图改变今天numpy数组元素的值,我想理解为什么它不起作用。我有两个数组(ab),我想更改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?

1 个答案:

答案 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