Numpy附加到数组

时间:2017-03-12 19:42:35

标签: python arrays numpy

我正在为Raspberry Pi构建一个项目,该项目在特定时间窗口内随机打开和关闭中继。为了管理时间段,我想使用每天生成的二维数组。因此,我的Python应用程序需要清空前一天的数组,并使用随机生成的开/关时隙填充它。我无法弄清楚如何将我的时间值附加到数组。有人能帮我吗? 这是我的代码:

  daily_slots = np.empty([1], dtype=[('onTime', np.dtype(int)), ('offTime', np.dtype(int))])
  # numpy populates the array with whatever is in memory at that time,
  # so delete the existing, 'empty' array row
  daily_slots = np.delete(daily_slots, 0, 0)

有了这个,我该如何追加价值? numpy文档说我应该做类似以下的事情:

daily_slots = np.append(daily_slots, [700, 800])

但那不起作用,我得到了

Traceback (most recent call last):
  File "./controller.py", line 351, in <module>
    init_app()
  File "./controller.py", line 128, in init_app
    build_daily_slots_array()
  File "./controller.py", line 307, in build_daily_slots_array
    daily_slots = np.append(daily_slots, [700, 800])
  File "/usr/lib/python2.7/dist-packages/numpy/lib/function_base.py", line 3555, in append
    return concatenate((arr, values), axis=axis)
TypeError: invalid type promotion

我已经尝试了所有我能想到的东西,而且我已经在numpy文档上戳了戳,并且我找不到答案。

我没有正确声明阵列吗?我想要每个阵列&#39; row&#39;由两个元素组成(开启时间和关闭时间)。

1 个答案:

答案 0 :(得分:0)

np.append使用np.concatenate。它不是列表追加的真实副本。它将新值转换为数组并进行连接。 但是为了与结构化数组连接,所有数组必须具有相同的dtype (或至少是兼容的,因此&#39;促销&#39;错误。

这有效:

In [4]: np.append(daily_slots, np.array((700, 800), dtype=daily_slots.dtype))
Out[4]: 
array([(  0, 1075970048), (700,        800)], 
      dtype=[('onTime', '<i4'), ('offTime', '<i4')])

这也有效。我必须添加[],以便第二个数组像第一个一样是1d。如果没有他们,那就是0d - 实际上np.append为游戏添加了所有内容。

In [6]: np.concatenate((daily_slots, np.array([(700, 800)], dtype=daily_slots.dtype)))
Out[6]: 
array([(  0, 1075970048), (700,        800)], 
      dtype=[('onTime', '<i4'), ('offTime', '<i4')])

对于成长和萎缩,列表通常更好。在这种情况下,包含2个元素元组的列表,或者可以是自定义类的列表。

如果它是元组列表,您可以将其包装在np.array中以将其转换为2d数组,以便于进行计算。