我不是很明白numpy.where()
的用法:
假设我有一个二维的numpy ndarray:
import numpy as np
twodim = np.array([[1, 2, 3, 4], [1, 6, 7, 8], [1, 1, 1, 12], [17, 3, 15, 16], [17, 3, 18, 18]])
现在,我想创建一个函数,用于“检查”这个Numpy数组的各种条件。
array([[ 1, 2, 3, 4],
[ 1, 6, 7, 8],
[ 1, 1, 1, 12],
[17, 3, 15, 16],
[17, 3, 18, 18]])
例如,这个数组中哪些元素是 (A) 偶数 (B) 大于7 (C) 可被3整除?
我想使用
numpy.where()
来实现,并遍历该数组的每个元素,最终找到符合所有条件的元素(如果存在这样的元素)。 even_entries = np.where(twodim % 2 == 0)
greater_seven = np.where(twodim > 7 )
divisible_three = np.where(twodim % 3 == 0)
如何做到这一点?我不确定如何迭代布尔值... 我可以通过以下方式访问矩阵的索引(i,j):
np.argwhere(even_entries)
我们可以做类似这样的事情:
import numpy as np
twodim = np.array([[1, 2, 3, 4], [1, 6, 7, 8], [1, 1, 1, 12], [17, 3, 15, 16], [17, 3, 18, 18]])
even_entries = np.where(twodim % 2 == 0)
greater_seven = np.where(twodim > 7 )
divisible_three = np.where(twodim % 3 == 0)
for row in even_entries:
for item in row:
if item: #equivalent to `if item == True`
for row in greater_seven:
for item in row:
if item: #equivalent to `if item == True`
for row in divisible_three:
for item in row:
if item: #equivalent to `if item == True`
# something like print(np.argwhere())
有什么建议吗?
编辑1:下面有很好的想法。正如@hpaulj所提到的,“您的测试生成与twodim形状相同的布尔矩阵”。 这是我在摆弄中遇到的问题——并非所有条件语句都会生成与我的起始矩阵形状相同的矩阵。例如,假设我正在比较数组元素是否具有与左侧或右侧匹配的数组(即水平比较)。
twodim[:, :-1] == twodim[:, 1:]
这导致产生一个(5,3)的布尔数组,而我们原始的矩阵是一个(5,4)的数组。
array([[False, False, False],
[False, False, False],
[ True, True, False],
[False, False, False],
[False, False, True]], dtype=bool)
如果我们沿着垂直方向进行相同的操作,那么得到的是一个(4,4)的布尔数组,而原始矩阵的形状是(5,4)。
twodim[:-1] == twodim[1:]
array([[ True, False, False, False],
[ True, False, False, False],
[False, False, False, False],
[ True, True, False, False]], dtype=bool)
如果我们想知道哪些条目具有垂直和水平对,很难确定我们在哪个维度上。
where
。我不知道为什么新的NumPy用户会继续使用它,但这很少是一个好主意。直接使用布尔掩码可以更轻松地完成此操作。 - user2357112