有没有办法用它的索引

问题描述

假设我有以下 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]])