所以我有以下数组:
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
但是不是吗?任何能够阐明原因的人?
上图中的第一个代码显示了错误的代码,第二个图像显示了具有正确效果的正确代码。我无法完全解决为什么第一个无效的问题。
答案 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