NumPy多重切片布尔值

3
我在编辑numpy数组中的值方面遇到了困难。
import numpy as np
foo = np.ones(10,10,2)

foo[row_criteria, col_criteria, 0] += 5
foo[row_criteria,:,0][:,col_criteria] += 5

"row_criteria"和"col_criteria"是布尔数组(1D)。在第一种情况下,我得到一个“形状不匹配:无法将对象广播到单个形状”的错误。在第二种情况下,"+=5"根本没有被应用。当我这样做时。
foo[row_criteria,:,0][:,col_criteria] + 5

我得到了一个修改后的返回值,但是在原地修改似乎不起作用...有人能解释一下如何修复吗?谢谢!

1
foo是一个一维数组,你为什么要尝试引用三个维度? - Cameron Sparr
抱歉,那是一个打错的字 - 我会快速更改为3D数组。 - ejang
1个回答

3

您需要:

foo[np.ix_(row_criteria, col_criteria, [0])] += 5

为了理解这个过程,可以举这个例子:
import numpy as np
A = np.arange(25).reshape([5, 5])
print A[[0, 2, 4], [0, 2, 4]]
# [0, 12, 24]

# The above example gives the the elements A[0, 0], A[2, 2], A[4, 4]
# But what if I want the "outer product?" ie for [[0, 2, 4], [1, 3]] i want
# A[0, 1], A[0, 3], A[2, 1], A[2, 3], A[4, 1], A[4, 3]
print A[np.ix_([0, 2, 4], [1, 3])]
# [[ 1  3]
#  [11 13]
#  [21 23]]

同样的方法也适用于布尔索引。此外,np.ix_并没有什么特别神奇的地方,它只是重新塑造其参数,以便可以相互广播:
i, j = np.ix_([0, 2, 4], [1, 3])
print i.shape
# (3, 1)
print j.shape
# (1, 2)

谢谢。但是为什么布尔数组不能返回我期望的相同视图? - ejang
因为你期望的是“外积”类型的视图。当你谈论布尔索引时,“外积”视图可能是更有用的一种,但在numpy中的默认是按元素索引。因为numpy支持多种类型的索引和广播,所以通过ix_函数实现“外积”索引非常容易,而默认使用逐元素索引似乎是合理的选择。但不管是不是合理的,numpy都是默认使用逐元素索引。 - Bi Rico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接