如何在Python中根据向量/矩阵中的每个元素检查值
这当然很简单,但现在我已经试着想了几个小时了。 我想对照10x1矩阵中的所有值检查一个值,如果它大于其中任何一个值,则应将其插入大于的元素之前 到目前为止,我已经尝试了以下代码的不同变体,但没有成功。 我得到的是如下所示:如何在Python中根据向量/矩阵中的每个元素检查值,python,loops,matrix,iteration,vectorization,Python,Loops,Matrix,Iteration,Vectorization,这当然很简单,但现在我已经试着想了几个小时了。 我想对照10x1矩阵中的所有值检查一个值,如果它大于其中任何一个值,则应将其插入大于的元素之前 到目前为止,我已经尝试了以下代码的不同变体,但没有成功。 我得到的是如下所示: [[ 157.] [ 3.] [ 6.] [ 6.] [ 5.] [ 9.] [ 0.] [ 0.] [ 0.] [ 0.]] 我所尝试的: col,col1,col2 = np.zeros((10,1)),np.zer
[[ 157.]
[ 3.]
[ 6.]
[ 6.]
[ 5.]
[ 9.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]]
我所尝试的:
col,col1,col2 = np.zeros((10,1)),np.zeros((10,1)),np.zeros((10,1))
for element in col:
if (aggdelay>element):
col[n,0] = aggdelay
col1[n,0] = flight_num
col2[n,0] = airline_id
break
n +=1
if (n>10):
n=0
我得到的输出如下所示:
[[ 157.]
[ 3.]
[ 6.]
[ 6.]
[ 5.]
[ 9.]
[ 0.]
[ 0.]
[ 0.]
[ 0.]]
输入为:
19790 1256 124.0
19790 1257 157.0
19790 1258 3.0
19790 1264 6.0
19790 1266 6.0
19790 1280 5.0
19790 1282 9.0
预期产出将是:
19790 1258 3.0
19790 1280 5.0
19790 1264 6.0
19790 1266 6.0
19790 1282 9.0
19790 1256 124.0
19790 1257 157.0
我实现了David提供的解决方案,但我发现很难用新元素更新“矩阵”。
这是我目前的解决方案,但我怀疑它没有正确更新
#!/usr/bin/python
import sys
import collections
import numpy as np
from operator import itemgetter
result =np.zeros((3,1))
col,col1,col2 = []*10,[]*10,[]*10
col11,col12,col23 = [],[],[]
old_flight_num, old_airline_id = None, None
lines = sys.stdin.readlines()
sumDelay1, num = 0, 1
n = 0
for line in lines:
line, line = line.strip(), line.split("\t")
if len(line) !=3:
continue
airline_id, flight_num, aggdelay = line
try:
aggdelay = float(aggdelay)
flight_num= int(flight_num)
airline_id = int(airline_id)
except ValueError:
continue
if (old_airline_id is not None) and (old_airline_id != airline_id):
res2.sort(key=itemgetter(2))
print(' ')
print('Here come the results for airline ID: ', (old_airline_id))
print(' ')
for row in res2:
print(row)
col,col1,col2 = []*10,[]*10,[]*10
n=0
if (n<10):
col.append(airline_id),col1.append(flight_num),col2.append(aggdelay)
else:
res = zip(col,col1,col2)
res.sort(key=itemgetter(2))
if (aggdelay>min(col2)):
res.remove(res[0])
col11.append(airline_id), col12.append(flight_num), col23.append(aggdelay)
res1 = zip(col11,col12,col23)
res2=res+res1
res2.sort(key=itemgetter(2))
col11,col12,col23 = [],[],[]
n += 1
old_airline_id = airline_id
if (old_airline_id is not None):
res2.sort(key=itemgetter(2))
print(' ')
print('Here come the results for airline ID: ', (old_airline_id))
print(' ')
for row in res2:
print(row)
#/usr/bin/python
导入系统
导入集合
将numpy作为np导入
从运算符导入itemgetter
结果=np.零((3,1))
列,列1,列2=[]*10,[]*10,[]*10
col11、col12、col23=[]、[]、[]
旧航班号,旧航空公司id=无,无
lines=sys.stdin.readlines()
sumDelay1,num=0,1
n=0
对于行中的行:
line,line=line.strip(),line.split(“\t”)
如果连(线)=三:
持续
航空公司id,航班号,总延误=线路
尝试:
aggdelay=浮动(aggdelay)
航班号=整数(航班号)
航空公司id=int(航空公司id)
除值错误外:
持续
如果(old_airline_id不是None)和(old_airline_id!=airline_id):
res2.sort(key=itemgetter(2))
打印(“”)
打印('这是航空公司ID的结果:',(旧航空公司ID))
打印(“”)
对于res2中的行:
打印(行)
列,列1,列2=[]*10,[]*10,[]*10
n=0
如果(nmin(col2)):
res.remove(res[0])
col11.append(航空公司id)、col12.append(航班号)、col23.append(累计延迟)
res1=zip(col11、col12、col23)
res2=res+res1
res2.sort(key=itemgetter(2))
col11、col12、col23=[]、[]、[]
n+=1
旧航空公司识别号=航空公司识别号
如果(旧航空公司id不是无):
res2.sort(key=itemgetter(2))
打印(“”)
打印('这是航空公司ID的结果:',(旧航空公司ID))
打印(“”)
对于res2中的行:
打印(行)
我非常希望能在这方面得到一些指导。
谢谢大家! 这可能会奏效,但我不得不猜测您对输出的预期以及您如何处理输入(假设以航空公司ID、航班号、延迟3列给出) 这将为您提供一个包含3列的
ndarray
对象,第一列是您的“延迟”,然后是航班号,然后是航空公司id,并按第一列排序
如果您只对top-N感兴趣,那么只需使用上面的方法构建整个矩阵并对其进行切片:
# return the top 10, or however many:
matrix = matrix[:10]
不使用list.sort
方法和切片,您可以按相反顺序对ndarray
对象进行排序:
m = zip(agg_delays,flight_nums,ids)
matrix = np.array(m, np.float32)
matrix.sort(0)
# return the top 10, or however many:
matrix = matrix[::-1][:10]
什么是“矩阵”?(Python中没有这样的数据类型。)请显示您的代码:)您的问题表明您有一些代码,但可能错误地没有实际包含您的代码。您打算只在第一个实例中插入,还是在
val>元素的所有实例中插入?
?年,我只需要更改操作系统。我希望我的编辑能胜任大卫的工作。如果我需要详细解释,请告诉我。正如您可能看到的,第三列中的每个数字在第一列和第二列中都有一个归属值。它们还应与存储的值放在同一索引中。我只是觉得在三个向量中进行比较容易,然后在最后合并它们。@DYZ By matrix我指的是一个多维numpy数组,这更令人满意吗?你尝试过这个函数吗?谢谢你在我缺乏信息的情况下尝试它。在我看来,如果我有关于航空公司id、航班号和延误的固定数量的信息,你的答案就行了。情况是我有更多的数据,而提供的数据只是我数据的一个子集。我需要评估每一行,其中包含航空公司id、航班号和航班延误,并根据延误的大小将其放入矩阵中,这样我的数据与相应的航空公司id和航班号的前10个延误就结束了。我希望这能进一步澄清问题。使用此方法构建整个矩阵,然后只需从你感兴趣的前10个(或多个)项目中分一杯羹。非常感谢你的意见,大卫!当我尝试压缩这三个变量时,我会得到以下错误:“压缩参数#3必须支持迭代”我如何处理这个错误消息?延迟是一个浮点数。在我的示例中,我假设您首先将所有数据收集到列表或其他序列对象中。然后你可以拉上拉链。