鉴于numpy
数组是连续存储的,如果我们尝试对其进行append
或extend
,则发生这种情况不是就地,而是,将为数组创建一个新副本,并为其留出足够的“空间”以使append
或extend
连续出现(请参见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库(例如scipy
或Pandas
)中实现这一目标的方法?
(根据评论和初步答案对问题进行了编辑,这些内容指出了我最初提出的问题有多不清楚-希望现在可以更清楚了)
答案 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)