2

我有一个 nympy 数组a = np.array([483, 39, 18, 999, 20, 48]

我有一组索引indices = np.array([2, 3])

我想拥有数组的所有索引,并用 0 填充其余索引,所以我得到结果:

np.array([0, 0, 18, 999, 0, 0])

谢谢您的回答。

4

3 回答 3

2

创建一个全零数组并复制所需索引处的值:

import numpy as np

a = np.array([483, 39, 18, 999, 20, 48])
indices = np.array([2, 3])

b = np.zeros_like(a)
b[indices] = a[indices]

# a = b     # if needed

print(a)
print(indices)
print(b)

输出:

[483  39  18 999  20  48]
[2 3]
[  0   0  18 999   0   0]

希望有帮助!

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
NumPy:       1.18.1
----------------------------------------

编辑:更好的是,使用np.setdiff1d

import numpy as np

a = np.array([483, 39, 18, 999, 20, 48])
indices = np.array([2, 3])

print(a)
print(indices)

a[np.setdiff1d(np.arange(a.shape[0]), indices, True)] = 0

print(a)

输出:

[483  39  18 999  20  48]
[2 3]
[  0   0  18 999   0   0]
于 2020-02-20T10:29:02.810 回答
-1

使用列表理解怎么样?

a = np.array([n if i in indices else 0 for i, n in enumerate(a)])

print(a) #array([  0,   0,  18, 999,   0,   0])
于 2020-02-20T10:57:55.247 回答
-2

您可以创建一个使用输入数组和索引数组的函数来执行此操作,如下所示:

import numpy as np

def remove_by_index(input_array, indexes):
    for i,_ in enumerate(input_array):
        if i not in indexes:
            input_array[i] = 0
    return input_array

input_array = np.array([483, 39, 18, 999, 20, 48])
indexes = np.array([2, 3])

new_out = remove_by_index(input_array, indexes)

expected_out = np.array([0, 0, 18, 999, 0, 0])

print(new_out == expected_out)  # to check if it's correct

编辑

您还可以在函数内部使用列表推导,这样会更好,例如:

def remove_by_index(input_array, indexes):
    return [input_array[i] if (i in indexes) else 0 for i,_ in enumerate(input_array)]

正如评论中指出的那样,它不是最有效的方法,在 Python 级别而不是 C 级别执行迭代,但它确实有效,并且对于随意使用它会解决。

于 2020-02-20T10:20:00.960 回答