Python:查找数组中元素的位置
Posted
技术标签:
【中文标题】Python:查找数组中元素的位置【英文标题】:Python: find position of element in array 【发布时间】:2015-01-31 08:55:44 【问题描述】:我有一个 CSV,其中包含天气数据,例如气象站的最高和最低温度、降水量、经度和纬度等。每种数据类别都存储在单个列中。
我想找到最高和最低温度的位置。找到最大值或最小值很容易: numpy.min(my_temperatures_column)
如何找到最小值或最大值所在的位置,以便找到经纬度?
这是我的尝试:
def coldest_location(data):
coldest_temp= numpy.min(mean_temp)
for i in mean_temp:
if mean_temp[i] == -24.6:
print i
错误:列表索引必须是 int
我将 CSV 的每一列都保存到变量中,所以它们都是单独的列表。
lat = [row[0] for row in weather_data] # latitude
long = [row[1] for row in weather_data] # longitude
mean_temp = [row[2] for row in weather_data] # mean temperature
我已经按照建议 list.index(x) 解决了问题
mean_temp.index(coldest_temp)
coldest_location=[long[5],lat[5]]
不确定在一个问题中提出第二个问题是否合适,但如果有两个位置的最低温度相同怎么办?我怎样才能找到两者及其索引?
【问题讨论】:
如果您的所有数据都在单独的列表中。您可以找到min
的索引号,然后使用它来查找出现在经度和纬度列表中相同位置的元素。如果您可以粘贴您的csv
文件的 sn-p,它会更容易看到
How to get item's position in a list?的可能重复
【参考方案1】:
你有没有想过使用 Python 列表的 .index(value)
方法?它返回在列表中找到第一个传入的value
实例的索引。
【讨论】:
当在 for 循环中访问这些索引时,当遍历相关错误(python 3)时,这似乎不起作用。就像给其他人的注释一样(我赞成这个答案)。 @cslotty 你能找到在循环中运行索引的解决方案吗? @lampre409 如果我猜对了,您可以使用枚举函数:programiz.com/python-programming/methods/built-in/enumerate【参考方案2】:如果没有实际看到您的数据,很难说在您的特定情况下如何找到最大值和最小值的位置,但一般来说,您可以按如下方式搜索位置。这只是下面的一个简单示例:
In [9]: a=np.array([5,1,2,3,10,4])
In [10]: np.where(a == a.min())
Out[10]: (array([1]),)
In [11]: np.where(a == a.max())
Out[11]: (array([4]),)
或者,您还可以执行以下操作:
In [19]: a=np.array([5,1,2,3,10,4])
In [20]: a.argmin()
Out[20]: 1
In [21]: a.argmax()
Out[21]: 4
【讨论】:
为什么np.where()
返回一个包含索引数组的列表,而不仅仅是索引数组?在numpy.org/doc/stable/reference/generated/numpy.where.html 中看不到答案【参考方案3】:
正如 Aaron 所说,您可以使用.index(value)
,但如果value
不存在,则会引发异常,因此您应该处理这种情况,即使您确定它永远不会发生。有几个选项是先检查它的存在,例如:
if value in my_list:
value_index = my_list.index(value)
或通过如下方式捕获异常:
try:
value_index = my_list.index(value)
except:
value_index = -1
正确的错误处理永远不会出错。
【讨论】:
对于第二个问题,您可以使用“列表理解”。这些可能看起来很棘手,但是一旦你掌握了它们,它们就会产生非常紧凑的代码。在您的情况下:[i for i in range(len(my_list)) if my_list[i] == value]
将返回请求的索引列表。如果没有匹配项,列表将为空,如果有匹配项,则列表将包含一个或多个元素。
您的答案可以通过指定缺失值将导致ValueError
被抛出来改进,因此您应该专门except ValueError:
。【参考方案4】:
对于您的第一个问题,使用 index() 在列表 x 中查找某个 值 的位置,如下所示:
x.index(value)
对于第二个问题,要检查多个相同的值,您应该将列表分成块并使用上面的相同逻辑。他们说分而治之。有用。试试这个:
value = 1
x = [1,2,3,4,5,6,2,1,4,5,6]
chunk_a = x[:int(len(x)/2)] # get the first half of x
chunk_b = x[int(len(x)/2):] # get the rest half of x
print(chunk_a.index(value))
print(chunk_b.index(value))
希望有帮助!
【讨论】:
【参考方案5】:在 NumPy 数组中,你可以像这样使用 where:
np.where(npArray == 20)
【讨论】:
【参考方案6】:你应该这样做:
try:
value_index = my_list.index(value)
except:
value_index = -1;
【讨论】:
你能解释一下你的答案吗?【参考方案7】:有一个内置的方法可以做到这一点:
numpy.where()
您可以在excellent detailed documentation 中找到更多相关信息。
【讨论】:
【参考方案8】:假设列表是对象的集合,如下所示:
obj = [
"subjectId" : "577a54c09c57916109142248",
"evaluableMaterialCount" : 0,
"subjectName" : "ASP.net"
,
"subjectId" : "56645cd63c43a07b61c2c650",
"subjectName" : ".NET",
,
"subjectId" : "5656a2ec3c43a07b61c2bd83",
"subjectName" : "Python",
,
"subjectId" : "5662add93c43a07b61c2c58c",
"subjectName" : "HTML"
]
您可以使用以下方法查找索引。假设 subjectId 为 5662add93c43a07b61c2c58c 则获取该对象在列表中的索引,
subjectId = "5662add93c43a07b61c2c58c"
for i, subjobj in enumerate(obj):
if(subjectId == subjobj['subjectId']):
print(i)
【讨论】:
【参考方案9】:我会假设您的变量 mean_temp 已经加载了值并且是 nX1 维度(即只有一行)。现在要实现您想要的,您可以:
更改变量的数据类型:
def coldest_location(data):
mean_temp = numpy.mat(mean_temp) #data is now matrix type
min_index = numpy.nonzero(mean_temp == mean_temp.min()) # this returns list of indexes
print mean_temp[min_index[0],min_index[1]] # printing minimum value, i.e -24.6 in you data i believe
【讨论】:
以上是关于Python:查找数组中元素的位置的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置 | Python
Leetcode刷题Python34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)