有没有办法用它的索引替换numpy数组中的元素

Is there way to replace an element in a numpy array with its index

假设我有以下 numpy 数组

 a = np.array(([4,5,6],[8,5,4]))
 
 Out[15]: 
 array([[4, 5, 6],
        [8, 5, 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]  

  

我想知道是否有更多 direct/pythonic 方法来完成此任务。

您可以使用 numpy.where:

w = np.where(a%2 == 0) #(array([0, 0, 1, 1]), array([0, 2, 0, 2]))
a[w] = w[0]

它 returns 条件为 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, 5, 1]])