我有一个 nympy 数组a = np.array([483, 39, 18, 999, 20, 48]
我有一组索引indices = np.array([2, 3])
我想拥有数组的所有索引,并用 0 填充其余索引,所以我得到结果:
np.array([0, 0, 18, 999, 0, 0])
谢谢您的回答。
创建一个全零数组并复制所需索引处的值:
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]
使用列表理解怎么样?
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])
您可以创建一个使用输入数组和索引数组的函数来执行此操作,如下所示:
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 级别执行迭代,但它确实有效,并且对于随意使用它会解决。