Numpy.empty()创建具有非空值的数组

时间:2018-04-07 20:55:56

标签: python arrays numpy data-structures stack

我目前正在上一些关于算法和数据结构的课程,并使用Python来实现我正在研究的一些东西。

目前我正在实施基于固定大小阵列的堆栈。鉴于python的特殊性,我选择使用numpy.empty()。

对于我已经写过的测试,我基本上将9个元素推入堆栈。到目前为止一切正常,因为结果数组有9个元素加上另一个7的空间。

我开始弹出元素,当我达到数组中只有4个元素的临界点时,我希望数组将元素复制到一个大小为8的新数组中。

问题在于,当我创建这个新数组时,已经填充了而不是使用空值创建。

Here an image of my terminal at that specific step when debugging with PDB

我有什么遗漏的吗?

编辑:似乎如果我使用Python 3,一切都按预期工作,这就是Python 2的情况

class StackV2(object):
"""
This is the Stack version based on fixed size arrays
"""
def __init__(self):
    self.array = numpy.empty(1, dtype=str)
    self.size = 0

def push(self, value):
    self.array[self.size] = value
    self.size += 1
    if len(self.array) == self.size:
        self._resize_array(len(self.array) * 2)

def pop(self):
    self.array[self.size - 1] = ""
    self.size -= 1
    if len(self.array) == (4 * self.size):
        self._resize_array(len(self.array) / 2)

def _resize_array(self, factor):
    new_array = numpy.empty(factor, dtype=str)
    print(new_array)
    index = 0
    for i in range(0, self.size):
        new_array[index] = self.array[i]
        index += 1
    self.array = new_array

1 个答案:

答案 0 :(得分:1)

简短回答

使用numpy.zeros代替numpy.empty来消除新阵列中的意外垃圾值。

细节

numpy.zeros创建的数组将其所有元素初始化为“零值”。对于dtype=str的数组,这将是空字符串''

来自Numpy docs

  

注释

     与零不同,

为空,不将数组值设置为零,因此可能稍微快一些。另一方面,它要求用户手动设置数组中的所有值,并应谨慎使用。

它在Python 3(但不是Python 2)中工作的事实是undefined behavior。基本上,这是Numpy开发人员没有计划实施的一个怪癖。最好的做法是不要在代码中依赖这些东西。正如您所见,未定义行为的结果不能保证在您运行代码的版本,实现,不同计算机上保持一致等。

另外,听起来你可能对Numpy阵列的工作原理有点困惑。 numpy数组在创建时以固定大小开始。这与普通的Python列表[]不同,后者在向其添加值时会动态增长。

此外,index中您不需要i_resize_array。只需使用其中一个,如下所示:

for i in range(self.size):
    new_array[i] = self.array[i]

除此之外,您的代码还可以。