给定另一个指定要清零的索引的数组,如何将 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 个索引:
y
的索引为第2个元素,即j
y
的值为第1个元素,即i
我试过这样做:
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]])
我有一个 (k,n) numpy 数组(称之为 D
),我必须根据另一个 numpy 数组中给出的索引将该数组中的特定条目清零,比如 y
, 即 (n,1).
以下是 D[i,j]
必须设置为零的 2 个索引:
y
的索引为第2个元素,即jy
的值为第1个元素,即i
我试过这样做:
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]])