【问题标题】:structured numpy ndarray, how to get values结构化的numpy ndarray,如何获取值
【发布时间】:2019-09-15 21:33:55
【问题描述】:

我有一个结构化的 numpy ndarray la = {'val1':0,'val2':1} 并且我想使用 0 和 1 作为键返回 val,所以我希望在我有 0 时返回 val1和 val2 当我有 1 这应该很简单但是我的尝试失败了,因为我不熟悉这个结构。

如何只返回对应的 val 或所有 val 的数组,以便我可以按顺序读取?

【问题讨论】:

  • 这个{'val1':0,'val2':1},是一个字典,不是一个结构化数组。如果你有,请分享MCVE

标签: python numpy dictionary key-value numpy-ndarray


【解决方案1】:

当您保存 Python 对象(非数组)时,numpy 会将其包装在数组中。对象是pickled

In [112]: np.save('test.npy', {'foo':34})                                              

在较新的numpy 版本中,您必须明确允许它加载腌制物品:

In [113]: data = np.load('test.npy')                                                   
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-113-c5835e6fb31e> in <module>
----> 1 data = np.load('test.npy')

/usr/local/lib/python3.6/dist-packages/numpy/lib/npyio.py in load(file, mmap_mode, allow_pickle, fix_imports, encoding)
    451             else:
    452                 return format.read_array(fid, allow_pickle=allow_pickle,
--> 453                                          pickle_kwargs=pickle_kwargs)
    454         else:
    455             # Try a pickle

/usr/local/lib/python3.6/dist-packages/numpy/lib/format.py in read_array(fp, allow_pickle, pickle_kwargs)
    720         # The array contained Python objects. We need to unpickle the data.
    721         if not allow_pickle:
--> 722             raise ValueError("Object arrays cannot be loaded when "
    723                              "allow_pickle=False")
    724         if pickle_kwargs is None:

ValueError: Object arrays cannot be loaded when allow_pickle=False


In [115]: data = np.load('test.npy',allow_pickle=True)                                 
In [116]: data                                                                         

结果是一个包含 1 个元素 (0d) 的对象 dtype 数组

Out[116]: array({'foo': 34}, dtype=object)

tolist 可以提取该对象,item() 也可以。

In [117]: data.tolist()                                                                
Out[117]: {'foo': 34}
In [118]: data.tolist()['foo']                                                         
Out[118]: 34
In [119]: data.item()                                                                  
Out[119]: {'foo': 34}
In [120]: data[()]                                                                     
Out[120]: {'foo': 34}

【讨论】:

    【解决方案2】:

    这看起来像字典,而不是 ndarray。假设您没有与相同值关联的多个键,您可以使用

    反转字典
    la_reversed = {v: k for k, v in la.items()}
    

    所以la_reversed[0] 将是'val1'la_reversed[1] 将是'val2'

    您可以使用list(la.values()) 获取字典中的值列表。

    【讨论】:

    • 在我的调试器中,它说它是一个 ndarray,当我尝试像使用字典一样使用项目或值时,我得到:labels = list(lb.values()) AttributeError: 'numpy. ndarray' 对象没有属性 'values'
    • 您能否编辑您的问题,以在每个 yatu 的评论中包含一个 MCVE,或者至少在您的代码中包含此变量的声明?
    • 这是一个我保存为 .npy 的变量,该变量实际上是我在 keras 中创建训练数据集生成器时获得的类索引值:train_generator.class_indices,这里 (keras.io/preprocessing/image) 它说:包含从类名到类索引的映射的字典可以通过属性 class_indices 获得。
    • 我把它保存为:labels = (train_generator.class_indices) np.save('/home/d/Desktop/s/classes', labels)
    • 如果文档声明 class_indices 应该是字典,我不确定为什么您的代码中不会出现这种情况。同样,如果您提供更多代码,将更容易确定问题所在。
    【解决方案3】:

    刚刚发现我可以使用 la.tolist() 并以某种方式返回字典?当我想要一个列表时,唉,从那里我能够解决我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-16
      • 2011-11-25
      • 2023-03-18
      • 2011-07-18
      • 2021-02-16
      • 2016-09-21
      • 1970-01-01
      • 2014-02-01
      相关资源
      最近更新 更多