numpy数组索引/赋值问题,看起来像应该工作的代码,不起作用

时间:2019-09-08 10:04:59

标签: python pandas numpy

所以我有以下数组:

c = np.array([[1,2,3],
             [4,5,6],
             [7,8,9]])

我想将大于2的第二列值更改为99,以下布尔分配可用于该目的:

c[c[:,1] > 2,1] = 99

但是,据我了解,以下代码也应该能够实现相同的目标:

c[c[:,1] > 2] = 99

但是不是吗?任何能够阐明原因的人?

image

上图中的第一个代码显示了错误的代码,第二个图像显示了具有正确效果的正确代码。我无法完全解决为什么第一个无效的问题。

2 个答案:

答案 0 :(得分:3)

c[:,1]将返回一个包含布尔值的向量。对于c中的每一行,一个布尔值,指定第二列中的值是否大于2,因此:

>>> c[:,1] > 2
array([False,  True,  True])

这确实是正确的:

c[:,1] > 2  |     c
----------------------
False       |  1  2  3
True        |  4  5  6
True        |  7  8  9

所以现在我们有了一个布尔掩码,这意味着我们将为 all 分配True所在的所有行的列。因此,这将以粗体显示以下项目:

c[:,1] > 2  |     c
----------------------
False       |  1  2  3
True        |  4  5  6
True        |  7  8  9

实际上,当我们处理此问题时,我们获得:

>>> c[c[:,1] > 2] = 99
>>> c
array([[ 1,  2,  3],
       [99, 99, 99],
       [99, 99, 99]])

但是,如果您指定c[np.array(False, True, True), 1],则仅分配给第二列,因此将要更新的项目为:

c[:,1] > 2  |     c
----------------------
False       |  1  2  3
True        |  4  5  6
True        |  7  8  9

当我们处理此问题时,这再次成立:

>>> c[c[:,1] > 2, 1] = 99
>>> c
array([[ 1,  2,  3],
       [ 4, 99,  6],
       [ 7, 99,  9]])

答案 1 :(得分:3)

让我们分解一下:c[c[:,1] > 2] = 99

从内部开始:c[:,1]的意思是“对于每个子数组,将项目置于位置1”

这给了我们c[[2,5,8] > 2] = 99

五个和八个都大于2。

因此,现在我们有了c[False, True, True] = 99 -仅索引到第一个子级别,因此我们不理第一行(因为它对应于False),然后将所有后两行都更改为True。

用括号更好地显示第二个正确的代码。

c[(c[:,1] > 2), 1] = 99

我们已经翻译了第一部分,所以简化的表达式变为:

c[(False, True, True), 1] = 99