【问题标题】:Selecting specific elements and finding their median using numpy使用 numpy 选择特定元素并找到它们的中位数
【发布时间】:2017-09-16 19:35:41
【问题描述】:

我有以下三个数据集。

  1. 2 3
  2. 4 5
  3. 6 6

  1. 5 7
  2. 7 4
  3. 9 9

  1. 1 8
  2. 2 3
  3. 3 2

基本上,我想创建一个列,其中元素将是第二列相应元素的中位数。每个集合的第二列的第一个元素是 (3,7,8) 和中位数 = 7,数据集的第二列的第二个元素是 (5,4,3) 和中位数 = 4 和第三个元素数据集的第二列是 (6,9,2) 和中位数 =6。所以我希望我的输出是一个像 [(7,4,6​​)] 这样的 numpy 数组。

我尝试了以下方法:

import numpy as np
filelist=[]
for i in range (1,4):
    filelist.append("/Users/Hrihaan/Desktop/A_%s.txt" %i)
for fname in filelist:
    data=np.loadtxt(fname)
    x=data[:,1]
    for j in range (0,3):
        y=np.median(x[j,1]) # tried this method and thought would get the arrays i want (3,7,8) , (5,4,3) and (6,9,2) and their medians
        print(y)

收到以下错误:(IndexError: too many indices for array)

任何建议都意义重大。

【问题讨论】:

    标签: python numpy median


    【解决方案1】:

    将第二列切片并沿相应的轴使用np.median -

    np.median([a[:,1],b[:,1],c[:,1]],axis=0)
    

    或者包装成数组,然后切片,最后使用np.median -

    np.median(np.asarray([a,b,c])[...,1], axis=0)
    

    或者使用np.median,这将负责转换为引擎盖下的数组,然后切片-

    np.median([a,b,c],axis=0)[:,1]
    

    因此,如果您有数组作为输入,请使用第一种方法以提高效率,否则后两种方法与数组/列表一样有效。

    示例运行 -

    In [10]: a = np.array([[2,3],[4,5],[5,6]])
        ...: b = np.array([[5,7],[7,4],[9,9]])
        ...: c = np.array([[1,8],[2,3],[3,2]])
        ...: 
    
    In [11]: np.median([a[:,1],b[:,1],c[:,1]],axis=0)
    Out[11]: array([ 7.,  4.,  6.])
    

    要使其与问题中发布的代码一起使用:

    # Grab filenames
    filelist=[]
    for i in range (1,4):
        filelist.append("/Users/Hrihaan/Desktop/A_%s.txt" %i)
    
    # Grab second columns off each
    data_list = []
    for fname in filelist:
        data=np.loadtxt(fname)
        data_list.append(data[:,1])
    
    desired_output = np.median(data_list,axis=0)
    

    【讨论】:

    • 如果我必须做同样的事情,但例如说 100 行,除了在这种情况下只有 3 行,您能否建议应该采用什么方法。按照您的指示,很难将 numpy 数组定义为 a、b 和 c。
    • @Hrihaan 三个数据集,每个有 100 行,你的意思是?
    • 是的,如果你能指导我采用这种方法,那就太好了,这样我就可以在任何情况下做到这一点@Divakar
    • @Hrihaan 所以,filelist 拥有三个输入数据集,对吧?然后,只需将[a,b,c] 替换为filelist。应该管用。即:np.median(filelist,axis=0)[:,1]np.median(np.asarray(filelist)[...,1], axis=0)
    • for fname in filelist: data=np.loadtxt(fname) x=np.median(filelist,axis=0)[:,1] print(x) (我试过上面的东西,得到了这个错误(TypeError: cannot perform reduce with flexible type)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多