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

时间:2020-02-18 11:57:34

标签: python python-3.x numpy numpy-ndarray

鉴于numpy数组是连续存储的,如果我们尝试对其进行appendextend,则发生这种情况不是就地,而是,将为数组创建一个新副本,并为其留出足够的“空间”以使appendextend连续出现(请参见https://stackoverflow.com/a/13215559/3286832)。

为避免这种情况,并假设我们很幸运地知道我们期望数组具有的特定元素数量,我们可以创建一个固定了numpy数组大小用零填充

import numpy as np

a = np.zeros(shape=(100,))  # [0. 0. 0. ... 0. 0. 0.]

假设我们要通过每次就地编辑此数组,每次都用一个新值填充该数组(例如,由用户提供):

pos = 0
a[pos] = 0.002              # [0.002 0. 0. ... 0. 0. 0.]

pos = pos + 1
a[pos] = 0.101              # [0.002 0.101 0. ... 0. 0. 0.]

# etc.

pos = -1
a[pos] = 42.00              # [0.002 0.101 ... ... ... 42.]

问题:

有没有一种方法可以跟踪下一个可用位置pos(即以前未使用新输入值填充的最后一个位置),而不是每次都手动递增pos

有没有一种方法可以有效地在numpy中实现呢?还是有另一种Python库(例如scipyPandas)中实现这一目标的方法?

(根据评论和初步答案对问题进行了编辑,这些内容指出了我最初提出的问题有多不清楚-希望现在可以更清楚了)

2 个答案:

答案 0 :(得分:0)

如果我对您的理解正确,则需要某种循环缓冲区。 Python为此提供了collections.deque

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

更新:正如评论中已经提到的那样,不可能立即跟踪np.array的更改。相反,您可以实现自己的类并在那里跟踪所有必要的更改(以我的implementation为例,例如,串联数组以扩展其大小)。我建议您在需要附加时使用python list,或者在需要固定大小的情况下使用deque。然后可以将两个数组都转换为np.array

答案 1 :(得分:0)

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

可能,您可以使用>>> 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]) >>> 中的切片,这些切片恰好用于快速更新数组,但是,我不确定这是您要执行的操作。

一些适合您的样品:

setTimeout("alert('test')",10000)