我目前正在上一些关于算法和数据结构的课程,并使用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
答案 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]
除此之外,您的代码还可以。