【问题标题】:Numpy Append to ArrayNumpy 追加到数组
【发布时间】:2017-03-12 19:42:34
【问题描述】:

我正在为 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 文档中戳了戳,但我没有找到答案。

我没有正确声明数组吗?我希望每个数组“行”由一个二元素数组(ontime 和 offtime)组成。

【问题讨论】:

  • numpy 追加非常慢,因为 numpy 保证连续内存。请改用 python 列表。
  • 您可能只需要一个列表。或者,如果你真的想要一个包含一些随机值的 numpy 数组,请使用 np.random。你几乎从不想要np.append。而且您的方法没有多大意义。您初始化 empty 数组,然后删除一行,然后追加一行……这不是您应该使用 numpy 的方式。
  • 这些回复都不能帮助我解决我的问题。建议替代方法并不能回答问题,也无济于事。
  • 我正在删除该行,因为当我初始化数组时,numpy 出于某种荒谬的原因将该行与虚拟数据一起放在那里。我找不到任何方法将数组初始化为空,否则我会这样做。我不是在寻找生成随机数据的方法,而是在尝试找到一种方法来存储我在二维数组中创建的随机数据。这应该是我可以得到问题答案的地方。我列出了我正在尝试做的事情,我解释了自己,并展示了我的代码。你能帮我回答我的问题吗?

标签: python arrays numpy


【解决方案1】:

np.append 使用np.concatenate。它不是列表附加的真实副本。它将新值转换为数组并进行连接。 但要与结构化数组进行连接,所有数组都必须具有相同的 dtype(或者至少是兼容的,因此会出现“促销”错误。

这行得通:

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 中,将其转换为二维数组,以便于计算。

【讨论】:

  • 感谢您回答我的问题,而不是无视我的问题,只是告诉我不要做我想做的事。你正在帮助我解决我的问题,同时也了解了一些关于 numpy 的知识。我真的很难理解为什么这是你最近在 StackOverflow 上得到的唯一答案类型。
猜你喜欢
  • 2015-02-21
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 2016-08-19
  • 2018-01-14
  • 2016-04-08
  • 2014-11-03
相关资源
最近更新 更多