为了账号安全,请及时绑定邮箱和手机立即绑定

使用新值填充到用零填充的固定形状的 numpy 数组中

使用新值填充到用零填充的固定形状的 numpy 数组中

慕森王 2022-08-02 17:35:45
假设数组是连续存储的,如果我们尝试或向它存储,那么这不是就地发生的,而是创建数组的新副本,并为或连续发生创建足够的“空间”(参见 https://stackoverflow.com/a/13215559/3286832)。numpyappendextendappendextend为了避免这种情况,并假设我们足够幸运地知道我们期望数组具有的特定元素数量,我们可以创建一个具有固定大小的数组,其中填充了零:numpyimport numpy as npa = np.zeros(shape=(100,))  # [0. 0. 0. ... 0. 0. 0.]假设我们希望通过就地编辑此数组,每次(例如,由用户提供)用新值填充每个元素的数组:pos = 0a[pos] = 0.002              # [0.002 0. 0. ... 0. 0. 0.]pos = pos + 1a[pos] = 0.101              # [0.002 0.101 0. ... 0. 0. 0.]# etc.pos = -1a[pos] = 42.00              # [0.002 0.101 ... ... ... 42.]问题:有没有办法跟踪下一个可用位置(即以前未用新输入值填充的最后一个位置),而不是每次都手动递增?pospos有没有办法有效地实现这一点,最好是?或者有没有一种方法可以在另一个Python库中实现这一点(例如 或 )?numpyscipyPandas(根据评论和初步答案编辑了问题,这些答案说明了我最初的问题措辞多么不清楚 - 希望现在更清楚)
查看完整描述

2 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

实际上,您的问题仍然让我感到困惑。如何定义要插入到新位置的新值?它是否来自您的代码外部?您的数组是否具有所有新值,还是只有数组的一部分?


也许,您可以使用 中的切片,这些切片正好用于数组的快速更新,但是,我并不完全确定这是您想要做的。numpy


为您提供一些示例:


>>> import numpy as np

>>> a = np.zeros(shape=(10,))

>>> a

array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])

>>> a[3:6] += 1

>>> a

array([0., 0., 0., 1., 1., 1., 0., 0., 0., 0.])

>>> a[:4] += .001

>>> a

array([1.000e-03, 1.000e-03, 1.000e-03, 1.001e+00, 1.000e+00, 1.000e+00,

       0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00])

>>> a[3:5] = [2, 1]

>>> a

array([1.e-03, 1.e-03, 1.e-03, 2.e+00, 1.e+00, 1.e+00, 0.e+00, 0.e+00,

       0.e+00, 0.e+00])

>>>


查看完整回答
反对 回复 2022-08-02
?
湖上湖

TA贡献2003条经验 获得超2个赞

如果我对你的理解是正确的,你需要某种循环缓冲区。Python有collections.deque用于此目的。

这是我使用 循环缓冲区的自定义实现,但您可以将其更改为 。h5pynumpy

更新:正如评论中已经提到的那样,不可能跟踪开箱即用的更改。相反,您可以实现自己的类并跟踪所有必要的更改(请参阅我的实现作为示例,即连接数组以扩展其大小)。我建议你使用python,如果你需要追加,或者你需要固定的大小。然后可以将这两个数组转换为np.arraylistdequenp.array


查看完整回答
反对 回复 2022-08-02
  • 2 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信