【问题标题】:How to fill an array with dictionary-type elements如何用字典类型的元素填充数组
【发布时间】:2019-05-31 13:58:47
【问题描述】:

我需要用字典元素填充数组。例如:

a = np.empty(2,2)

而且我需要这样填写(这是不允许的)

for i in range(2):
   for j in range(2):
      a[i,j] = {'x': b[i], 'y': c[j]}

其中bc是数据框的其他列表/数组或列。

【问题讨论】:

  • 为什么要为此使用 numpy 数组?使用列表
  • 你的问题是什么?添加 b 和 c 的示例
  • numpy 用于数值数组;如果你想要一个dicts数组使用一个列表,如果你想要一个类似数据库的结构,那么试试pandas。 pandas.pydata.org/pandas-docs/version/0.23.4/generated/…
  • 你可以使用objectdtype:a = np.empty((2,2), object)。正如其他海报所暗示的那样,由此产生的arrays 功能是有限的,但如果您只需要“ND 索引”就可以了,

标签: python arrays numpy dictionary


【解决方案1】:
import numpy as np

a = np.zeros((2, 2))
b = np.ones(a.shape[0])
c = np.ones(a.shape[1]) * [2]

list_a = a.tolist()

for i in range(2):
   for j in range(2):
      list_a[i][j] = {'x': b[i], 'y': c[j]}

a = np.array(list_a)

print(a)

输出:

array([[{'x': 1.0, 'y': 2.0}, {'x': 1.0, 'y': 2.0}],
       [{'x': 1.0, 'y': 2.0}, {'x': 1.0, 'y': 2.0}]], dtype=object)

【讨论】:

    【解决方案2】:

    如果你创建一个对象 dtype 数组,你可以在槽中放任何东西:

    In [9]: a = np.empty((2,2), object)                                                  
    In [10]: a                                                                           
    Out[10]: 
    array([[None, None],                  # empty() fills with None
           [None, None]], dtype=object)
    In [11]: for i in range(2): 
        ...:     for j in range(2): 
        ...:         a[i,j] = {'x':b[i], 'y':c[j]} 
        ...:                                                                             
    In [12]: a                                                                           
    Out[12]: 
    array([[{'x': 1, 'y': 4}, {'x': 1, 'y': 3}],
           [{'x': 3, 'y': 4}, {'x': 3, 'y': 3}]], dtype=object)
    

    但列表推导式同样有效

    In [13]: [[{'x':b[i],'y':c[j]} for j in range(2)] for i in range(2)]                 
    Out[13]: [[{'x': 1, 'y': 4}, {'x': 1, 'y': 3}], [{'x': 3, 'y': 4}, {'x': 3, 'y': 3}]]
    In [14]: np.array(_)                                                                 
    Out[14]: 
    array([[{'x': 1, 'y': 4}, {'x': 1, 'y': 3}],
           [{'x': 3, 'y': 4}, {'x': 3, 'y': 3}]], dtype=object)
    

    或者你可以从一个平面列表开始,然后重塑数组:

    In [15]: [{'x':b[i],'y':c[j]} for j in range(2) for i in range(2)]                   
    Out[15]: [{'x': 1, 'y': 4}, {'x': 3, 'y': 4}, {'x': 1, 'y': 3}, {'x': 3, 'y': 3}]
    In [16]: np.array(_)                                                                 
    Out[16]: 
    array([{'x': 1, 'y': 4}, {'x': 3, 'y': 4}, {'x': 1, 'y': 3},
           {'x': 3, 'y': 3}], dtype=object)
    In [18]: _.reshape(2,2)                                                              
    Out[18]: 
    array([[{'x': 1, 'y': 4}, {'x': 3, 'y': 4}],
           [{'x': 1, 'y': 3}, {'x': 3, 'y': 3}]], dtype=object)
    

    这个字典数组不会比列表更容易或更快地使用。

    或者,我们可以创建一个包含 2 个命名字段的结构化数组。从元组列表开始:

    In [19]: [(b[i],c[j]) for j in range(2) for i in range(2)]                           
    Out[19]: [(1, 4), (3, 4), (1, 3), (3, 3)]
    In [20]: np.array(_, dtype=[('x',int),('y',int)])                                    
    Out[20]: array([(1, 4), (3, 4), (1, 3), (3, 3)], dtype=[('x', '<i8'), ('y', '<i8')])
    In [21]: _.reshape(2,2)                                                              
    Out[21]: 
    array([[(1, 4), (3, 4)],
           [(1, 3), (3, 3)]], dtype=[('x', '<i8'), ('y', '<i8')])
    In [22]: _['x']                                                                      
    Out[22]: 
    array([[1, 3],
           [1, 3]])
    

    相比之下,从二维对象数组中获取所有x 值:

    In [24]: [i['x'] for i in a.flat]                                                    
    Out[24]: [1, 1, 3, 3]
    

    【讨论】:

      猜你喜欢
      • 2022-11-16
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多