给定另一个指定要清零的索引的数组,如何将 2D numpy 数组中的特定条目清零?

How to zero out specific entries in a 2D numpy array given another array that specifies the indices to zero out?

我有一个 (k,n) numpy 数组(称之为 D),我必须根据另一个 numpy 数组中给出的索引将该数组中的特定条目清零,比如 y, 即 (n,1).

以下是 D[i,j] 必须设置为零的 2 个索引:

我试过这样做:

    tmp = np.where(y==0, 0, D)
    result = np.add(tmp, D[1:,:])

但我得到 ValueError: operands could not be broadcast together with shapes (3,100) (2,100) 。 有没有更简洁的方法可以使用 numpy 函数将 D 中的那些特定元素清零?

我会设计一些 D[5,10]y[10,1],因为你没有提供 MWE。然后,通过 y.ravel() 使用 y 作为第一个索引,并使用 np.arange(n) 作为第二个索引。所以,D[y.ravel(), np.arange(n)] = 0 会做你想做的事。

import numpy as np
k, n = 5, 10
y = np.random.randint(0,k, (n,1))
D = np.random.randint(1,n, (k,n))

D[y.ravel(), np.arange(n)] = 0

这个人为示例的输出:

print(y.T)
[[0 3 4 2 1 4 4 2 3 2]]

print(D) # Original
[[6 5 8 3 2 8 1 7 9 4]
 [6 1 4 5 1 2 6 1 8 9]
 [4 1 9 3 2 7 2 2 8 1]
 [2 4 1 7 6 2 2 1 3 5]
 [5 7 4 2 1 1 4 7 9 7]]

print(D) # Modified 
[[0 5 8 3 2 8 1 7 9 4]
 [6 1 4 5 0 2 6 1 8 9]
 [4 1 9 0 2 7 2 0 8 0]
 [2 0 1 7 6 2 2 1 0 5]
 [5 7 0 2 1 0 0 7 9 7]]

让我们创建 D 数组为:

k = 4
n = 5
D = np.arange(1, k * n + 1).reshape(k, n)

则令y为:

y = np.array([2, 0, 3, 1, 3]).reshape(-1, 1)

第一个操作是获取y作为一维数组:

yy = y[:,0]

然后,要将指示的元素归零,运行:

D[yy, np.arange(yy.size)] = 0

即您传递了一个 list 行索引和另一个列列表 索引(大小相等)。

结果是:

array([[ 1,  0,  3,  4,  5],
       [ 6,  7,  8,  0, 10],
       [ 0, 12, 13, 14, 15],
       [16, 17,  0, 19,  0]])