Python - 从数组

时间:2016-08-25 01:09:46

标签: python arrays numpy

我有一组数字形状(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

7 个答案:

答案 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是数组还是列表。

numpywhere,返回数组中布尔值的索引

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)