【问题标题】:Numpy array using values of an object使用对象值的 Numpy 数组
【发布时间】:2020-12-16 18:05:58
【问题描述】:

我有一个对象 -> {0: 0.8, 1: 0.2, 2: 0, 3: 0}

我想将它转换为一个numpy数组,其中键是索引,值是数组的值-> [0.8, 0.2, 0, 0]

什么是最快和最有效的方法?

我正在使用 for 循环,但有更好的方法吗?

【问题讨论】:

  • 下面的d.values() 答案对于您的有序输入是正确的(假设您有 py >3.6,其中 dict (stackoverflow.com/questions/39980323/…) 获得了插入顺序)。但是,您的 dict 是否有可能以“错误”的顺序输入?例如d = {1:1.1, 2:2.2, 0: 0.8}

标签: python arrays numpy object type-conversion


【解决方案1】:

输入 dict 未排序或缺少值时的解决方案:

d = {1:1.1, 2:2.2, 0: 0.8, 4:4.4}
sz = 1+max(d.keys())   # or len(d) if you are sure there are no missing values 
x = np.full(sz, np.nan)
x[list(d.keys())] = list(d.values())
x
#array([0.8, 1.1, 2.2, nan, 4.4])

【讨论】:

    【解决方案2】:

    字典本质上是无序的。您需要根据您的键对值进行排序(假设您的字典中没有缺少键):

    a = {0: 0.8, 1: 0.2, 2: 0, 3: 0}
    np.array([i[1] for i in sorted(a.items(), key=lambda x:x[0])])
    

    另一种方法是在 numpy 中排序:

    b = np.array(list(a.items()))
    b[b[:,0].argsort()][:,1]
    

    输出:

    [0.8, 0.2, 0, 0]
    

    【讨论】:

      【解决方案3】:

      keysitemsvalues 是从字典中获取“东西”的最快方法。否则,您必须对键进行迭代。一种允许跳过索引和无序索引的通用方法:

      In [81]: adict = {0: 0.8, 1: 0.2, 2: 0, 3: 0}                                                        
      In [82]: keys = list(adict.keys())                                                                   
      In [83]: arr = np.zeros(max(keys)+1)    # or set your own size                                                                 
      In [84]: arr[keys] = list(adict.values())                                                            
      In [85]: arr                                                                                         
      Out[85]: array([0.8, 0.2, 0. , 0. ])
      

      【讨论】:

        【解决方案4】:

        上面的答案给出了dict_values,但方向正确

        正确的做法是:

        d = {0: 0.8, 1: 0.2, 2: 0, 3: 0}
        np_array = np.array(list(d.values()))
        
        

        【讨论】:

          【解决方案5】:

          假设您的字典名为dict

          numpy_array = np.array([*dict.values()])
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-20
            • 1970-01-01
            • 2022-01-26
            • 2011-09-02
            • 2015-05-05
            • 1970-01-01
            相关资源
            最近更新 更多