繁体   English   中英

Numpy.empty() 使用非空值创建数组

[英]Numpy.empty() creating array with non-empty values

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

目前我正在实现一个基于固定大小数组的堆栈。 鉴于 python 的特殊性,我选择使用 numpy.empty()。

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

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

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

这是使用 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

简答

使用numpy.zeros而不是numpy.empty来摆脱新数组中的意外垃圾值。

细节

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

Numpy 文档

笔记

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

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

此外,听起来您可能对 Numpy 数组的工作方式有点困惑。 创建 numpy 数组时,它以固定大小开始。 这与普通的 Python 列表[] ,它会随着您向其中添加值而动态增长。

此外,您不需要_resize_array indexi 只需使用其中一个,如下所示:

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

除此之外,您的代码很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM