问题描述
假设我有以下 numpy 数组
a = np.array(([4,5,6],[8,4]))
Out[15]:
array([[4,4]])
问题: 是否有一种 Pythonic 方法可以有条件地用索引值中的数字替换数组中的元素?例如,我如何用它们的行号替换所有偶数?我可以用一个单独的行号数组来相当笨拙地完成这个任务,如下所示。
b = np.arange(a.shape[0])
c = np.stack([b] * a.shape[1])
rownum = c.T
# I think that maybe rownum can be replaced by broadcasting b? but I can't get it to work.
a[a % 2 == 0] = rownum[a % 2 == 0]
我想知道是否有更直接/pythonic 的方法来实现这一点。
解决方法
您可以使用numpy.where
:
w = np.where(a%2 == 0) #(array([0,1,1]),array([0,2,2]))
a[w] = w[0]
它返回条件为 True
的索引,由轴分隔,在本例中为行和列。
一种非常相似的方法是使用 numpy.nonzero
:
w = np.nonzero(a%2 == 0)
a[w] = w[0]
注意:按照文档,在这种情况下,nonzero
应该优先于 where
。
使用以下代码:
a = np.where(a % 2 == 0,np.fromfunction(lambda r,c: r,a.shape,dtype=a.dtype),a)
步骤:
-
np.fromfunction(...)
- 包含要替换的值的数组。 -
a
- 原始值。 -
a % 2 == 0
- 选择标准 - 源数组从中获取值 用于当前元素。
结果是:
array([[0,5,0],[1,1]])