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

Python 使用新值填充到填充有零的固定形状numpy数组,python,python-3.x,numpy,numpy-ndarray,Python,Python 3.x,Numpy,Numpy Ndarray,假设一个numpy数组是连续存储的,如果我们试图append或extend到它,那么这种情况不会发生,而是会创建一个新的数组副本,为append或extend连续存储提供足够的“空间”(请参阅) 为了避免这种情况,并且假设我们足够幸运地知道我们期望数组具有的元素的具体数量,我们可以创建一个numpy数组,其中固定大小填充有零: import numpy as np a = np.zeros(shape=(100,)) # [0. 0. 0. ... 0. 0. 0.] pos = 0 a[

假设一个
numpy
数组是连续存储的,如果我们试图
append
extend
到它,那么这种情况不会发生,而是会创建一个新的数组副本,为
append
extend
连续存储提供足够的“空间”(请参阅)

为了避免这种情况,并且假设我们足够幸运地知道我们期望数组具有的元素的具体数量,我们可以创建一个
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.]
假设我们希望通过在位编辑此数组,每次用新值填充此数组中的每个元素(例如,由用户提供):

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
)中有没有实现这一点的方法


(根据评论和初步答案编辑了问题,其中说明了我最初的问题措辞有多不清晰-希望现在更清晰)

如果我理解正确,您需要某种循环缓冲。Python为此提供了一种新的方法

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


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

如果我理解正确,您需要某种循环缓冲区。Python为此提供了一种新的方法

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


更新:正如评论中已经提到的那样,不可能即时跟踪
np.array
的更改。相反,您可以实现自己的类,并在其中跟踪所有必要的更改(以my为例,即连接数组以扩展其大小)。如果需要追加,我建议您使用python
list
,如果需要固定大小,建议您使用
deque
。这两个数组都可以转换成np。实际上,你的问题对我来说仍然很困惑。如何定义要插入到新位置的新值?它是否来自您的代码之外?您是否拥有数组的所有新值,或者只是其中的一部分

也许,您可以使用
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])
>>>

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

也许,您可以使用
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])
>>>

你的问题有点让人困惑。在示例代码中,没有向数组“附加”任何内容。“append”意味着在现有数组的边界之外添加值。相反,您正在更改已为其分配了空间的数组中的值。因此,重新分配不需要发生。@jussinurmine你是对的,我误用了“附加”和“扩展”这两个术语。我将编辑我的问题以删除这些内容,并明确表示我只想在这个用零数组实例化的固定大小中逐个插入新值。我仍然不确定您想要实现什么。您的示例代码很好;它会更改数组中的现有值。你还想做些什么吗?@jussinurminen我刚刚编辑了我的问题,以便根据你的评论和初步答案更清楚-希望这能让问题更清楚。如果你想使用带有预分配数组的
numpy
,你需要跟踪
pos
。否则,就无法知道以前写过哪些位置。(当然,您可以尝试一些技巧,比如使用特殊值(如
np.nan
)预先分配数组,以跟踪未写入的位置,但这比跟踪索引更为笨拙)。如果您想要更简单的代码,另一种技术可能是使用Python列表收集值(使用
.append
方法),然后将其转换为numpy数组。您的问题有点让人困惑。在示例代码中,没有向数组“附加”任何内容。“append”意味着在现有数组的边界之外添加值。相反,您正在更改已为其分配了空间的数组中的值。因此,重新分配不需要发生。@jussinurmine你是对的,我误用了“附加”和“扩展”这两个术语。我将编辑我的问题以删除这些内容,并明确表示我只想在这个用零数组实例化的固定大小中逐个插入新值。我仍然不确定您想要实现什么。您的示例代码很好;它会更改数组中的现有值。你还想做些什么吗?@jussinurminen我刚刚编辑了我的问题,以便根据你的评论和初步答案更清楚-希望这能让问题更清楚。如果你想使用带有预分配数组的
numpy
,你需要跟踪
pos
。其他人