假设我在Python中有一个数组,例如:
my_array = np.array([10, -5, 4, ...])
my_indices = np.array([0, 3, 10, ...])
我如何有效获取:
my_array
my_indices
的索引列表
my_array
中的元素列表<{1}} 引用 my_indices
(琐事为1,但可能有直接方式)答案 0 :(得分:5)
我可能会这样做:
>>> import numpy as np
>>> a = np.random.random(10) # set up a random array to play with
>>> a
array([ 0.20291643, 0.89973074, 0.14291639, 0.53535553, 0.21801353,
0.05582776, 0.64301145, 0.56081956, 0.85771335, 0.6032354 ])
>>>
>>> b = np.array([0,5,6,9]) # indices we *don't want*
>>> mask = np.ones(a.shape,dtype=bool)
>>> mask[b] = False # Converted to a mask array of indices we *do want*
>>> mask
array([False, True, True, True, True, False, False, True, True, False], dtype=bool)
>>>
>>> np.arange(a.shape[0])[mask] #This gets you the indices that aren't in your original
array([1, 2, 3, 4, 7, 8])
>>> a[mask] #This gets you the elements not in your original.
array([ 0.89973074, 0.14291639, 0.53535553, 0.21801353, 0.56081956,
0.85771335])
答案 1 :(得分:2)
对于第1部分,您可以使用Python的built in set
类来使用两组之间的差异。
my_array = [1,2,3,4]
my_indices = [3,4,5]
print list(set(my_array) - set(my_indices))
将输出:[1, 2]
。
修改强>
为了返回my_array
中不在my_indices
中的索引列表,您可以使用列表理解:
my_array = [1,2,3,4]
my_indices = [0,3]
print [x for x in range(len(my_array)) if x not in my_indices]
其中也可以表示为:
temp = []
for x in range(len(my_array)):
if x not in my_indices:
temp.append(x)
这将返回索引[1,2]
。
如果您想获取元素列表,则可以将语句修改为:
print [my_array[x] for x in range(len(my_array)) if x not in my_indices]
将输出[2,3]
。
答案 2 :(得分:1)
对于第一个问题:
my_indices_set = set(my_indices)
[i for i, x in enumerate(my_array) if i not in my_indices]
关于第二个问题:
[x for x in my_array if x not in my_indices_set]
如果我们使用集合会更有效率,但是首先创建集合的成本是
答案 3 :(得分:1)
您可以使用列表推导
array_len = len(my_array)
missing_indices = [i for i in my_indices
if i < 0 or i >= array_len]
elems = [my_array[i] for i in missing_indices]