如何在2D numpy数组给定另一个指定索引为零的数组中零化特定条目?



我有一个(k,n) numpy数组(称为D),我必须根据另一个numpy数组(例如y)给出的下标将该数组中的特定项归零,即(n,1)。

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

  • y的索引为第2元素,即j

  • y的值是第一个元素,或者i

I tried doing this:

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)。有没有一种更干净的方法,我可以零那些特定的元素从D使用numpy函数?

由于您没有提供MWE,我将设计一些D[5,10]y[10,1]。然后,使用y作为第一个索引,通过y.ravel()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

。传递一个列表行下标和另一个列列表索引(大小相等)。

结果是:

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

最新更新