[Python] Turning list of UserDict into numpy array

Discussão em 'Python' iniciado por Stack, Junho 10, 2025.

  1. Stack

    Stack Membro Participativo

    Because plain dict is not adequate for inheritance, I design the following MyDict with UserDict in python standard libraries:

    import numpy as np
    from collections import UserDict

    class MyUserDict(UserDict):
    pass

    m_dict = {'a': np.arange(2),
    'b': np.arange(2)}
    m_mydict = MyUserDict(m_dict)


    Then I meet a problem. When turning a list of UserDict into numpy array, values in UserDict have lost:

    m_dict_array = np.array([m_dict, m_dict])
    m_mydict_array = np.array([m_mydict, m_mydict])
    print(m_dict_array)
    print(m_mydict_array)

    """ The output is
    [{'a': array([0, 1]), 'b': array([0, 1])}
    {'a': array([0, 1]), 'b': array([0, 1])}]
    [['a' 'b']
    ['a' 'b']]
    """


    The solution I find is adding __array__() method to MyUserDict:

    class MyUserDict(UserDict):
    def __array__(self):
    # Prevent NumPy from converting to an array of keys
    return np.array(self.data, dtype=object)

    m_mydict = MyUserDict(m_dict)
    m_mydict_array = np.array([m_mydict, m_mydict])
    print(m_mydict_array)


    This indeed solve my problem. But another problem I quickly realized is that self.data is plain dict and elements in m_mydict_array may be also plain self.data. So, I check the type as follows:

    print(type(m_mydict_array[0]))


    The type is MyUserDict I defined. This is certainly the result I hoped for, but I have no idea why it turned out like this.

    Continue reading...

Compartilhe esta Página