[英]Numpy.empty() creating array with non-empty values
我目前正在学习一些关于算法和数据结构的课程,并使用 Python 来实现我一直在研究的一些东西。
目前我正在实现一个基于固定大小数组的堆栈。 鉴于 python 的特殊性,我选择使用 numpy.empty()。
对于我编写的测试,我基本上将 9 个元素推入堆栈。 到目前为止一切正常,因为结果数组有 9 个元素加上另外 7 个的空间。
我开始弹出元素,当我达到数组中只有 4 个元素的临界点时,我希望数组将元素复制到大小为 8 的新数组中。
问题是,当我创建这个新数组时,已经填充了空值而不是创建。
有什么我错过的吗?
编辑:似乎如果我使用 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
使用numpy.zeros
而不是numpy.empty
来摆脱新数组中的意外垃圾值。
由numpy.zeros
创建的数组的所有元素都初始化为“零值”。 对于具有dtype=str
数组,这将是空字符串''
。
从Numpy 文档:
笔记
与零不同,空不会将数组值设置为零,因此可能会稍微快一点。 另一方面,它需要用户手动设置数组中的所有值,应谨慎使用。
它在 Python 3(但不是 Python 2)中工作的事实是未定义的行为。 基本上,这是 Numpy 开发人员没有计划的实现的怪癖。 最好的做法是不要在你的代码中依赖这些东西。 如您所见,无法保证未定义行为的结果在版本、实现、运行代码的不同计算机等之间保持一致。
此外,听起来您可能对 Numpy 数组的工作方式有点困惑。 创建 numpy 数组时,它以固定大小开始。 这与普通的 Python 列表[]
,它会随着您向其中添加值而动态增长。
此外,您不需要_resize_array
index
和i
。 只需使用其中一个,如下所示:
for i in range(self.size):
new_array[i] = self.array[i]
除此之外,您的代码很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.