我有一组数字形状(1220,),名为x
我正在查看大于1.0的数字,
mask1 = [i for i in x if i>1.0 ]
返回
[1.2958354, 1.0839227, 1.1919032]
我现在的问题是如何在初始数组x
中确定这些值的索引位置?
我已逐个尝试过,但发生错误
list(x).index(1.2958354)
ValueError: 1.2958354 is not in list
答案 0 :(得分:4)
您已将其标记为numpy
,并描述了shape
(不是len
)。这让我觉得你有一个numpy数组。
In [665]: x=np.random.rand(10)
In [666]: x
Out[666]:
array([ 0.6708692 , 0.2856505 , 0.19186508, 0.59411697, 0.1188686 ,
0.54921919, 0.77402055, 0.12569494, 0.08807101, 0.11623299])
In [667]: x>.5
Out[667]: array([ True, False, False, True, False, True, True, False, False, False], dtype=bool)
In [668]: list(x).index(.6708692)
ValueError: 0.6708692 is not in list
ValueError
的原因是你正在寻找一个浮点数,而那些通常不完全匹配。如果数组是int,那么这样的索引就可以工作。
In [669]: list(np.arange(10)).index(5)
Out[669]: 5
这种推理适用于x
是数组还是列表。
numpy
有where
,返回数组中布尔值的索引
In [670]: np.where(x>.5)
Out[670]: (array([0, 3, 5, 6], dtype=int32),)
x>.5
是如上所示的布尔数组,[0,3,5,6]
是真实的索引值。
In [671]: x[np.where(x>.5)]
Out[671]: array([ 0.6708692 , 0.59411697, 0.54921919, 0.77402055])
相等测试不再有效
In [672]: x[np.where(x==0.6708692)]
Out[672]: array([], dtype=float64)
对于浮点数有close
的概念 - 差异在一定容差范围内(np.allclose
特别有用):
In [679]: np.where(np.isclose(x,0.59411697))
Out[679]: (array([3], dtype=int32),)
对于列表,其中一个枚举解决方案很棒,也适用于1d数组。但它已经是一个数组,使用where
。
答案 1 :(得分:1)
尝试:
mask1 = [i for i in range(len(x)) if x[i]>1.0]
答案 2 :(得分:1)
您可以使用index
上的x
函数,它将返回每个值的第一个索引。要从mask1
获取所有索引的列表,请尝试:
map(x.index, mask1)
答案 3 :(得分:1)
mask_1 = [index for index, value in enumerate(x) if value > 1.0]
答案 4 :(得分:1)
尝试使用enumerate()
一起获取索引和值:
mask1 = [(i,v) for i,v in enumerate(x) if v > 1.0]
答案 5 :(得分:1)
您可以使用枚举功能,例如:
mask1 = [(i, value) for i, value in enumerate(x) if value>1.0 ]
print mask1
答案 6 :(得分:1)
使用enumerate创建索引和过滤值的元组对,然后使用zip和*运算符将变量解压缩到单独的列表中。
a = np.array([0, 1, 2, 3])
idx, vals = zip(*[(i, v) for i, v in enumerate(a) if v > 1])
>>> idx
(2, 3)
>>> vals
(2, 3)