首页 > 解决方案 > numpy.ndarray' 对象没有属性 'append' - 使用 numpy 创建堆栈时出现错误

问题描述

我想使用 numpy 创建一个堆栈

我尝试了以下代码,但是“numpy.ndarray”对象没有属性“附加””这个错误来了我尝试用其他属性替换附加,但是这些方法中的任何一个都对我不起作用。有人可以在您的电脑中运行代码并建议我解决此问题的方法。

Traceback (most recent call last):
  File "C:\Users\Banchi\Desktop\numpy\main.py", line 3, in <module>
    myStack.push(11)
  File "C:\Users\Banchi\Desktop\numpy\stackf.py", line 8, in push
    return self.Stack.append(data)
AttributeError: 'numpy.ndarray' object has no attribute 'append'

stackf.py

import numpy as np

class Stack:
    def __init__(self):
        self.Stack =np.array([])

    def push(self,data):
            return self.Stack.append(data)
            print("stack overfolow")

    def pop(self):
        if len(self.Stack)==0:
            print("stack underflow")
        else:
            return self.Stack.pop()
    def __len(self):
        return len(self.Stack)

    def top(self):
        if len(self.Stack)==0:
            print("stack under flow")
        else:
            return self.Stack[len(self.Stack)-1]

    def is_empty(self):
        return len(self.Stack) == 0

    def is_full(self):
        return len(self.Stack) == self.limit


    def size(self):
        return len(self.Stack)

主文件

from stackf import Stack
myStack = Stack()
myStack.push(11)
myStack.push(11)
myStack.push(11)
myStack.push(11)
print(myStack.size())
myStack.push(10)
myStack.push(20)
myStack.push(30)

print(myStack)

标签: pythonarraysnumpystack

解决方案


您可以定义您的类,例如:

class Stack:
    def __init__(self, limit : int = 0):
        self.arr = np.array([])
        self.limit = limit

    def is_empty(self) -> bool:
        return self.size() == 0

    def pop(self):
        n = self.size() - 1
        if n < 0:
            raise Exception('pop - Stack is empty')
        rv = self.arr[n]
        self.arr = np.delete(self.arr, n)
        return rv

    def push(self, data):
        if self.limit > 0 and self.limit == self.size():
            raise Exception('push - Limit exceeded')
        self.arr = np.append(self.arr, data)

    def size(self) -> int:
        return self.arr.size

    def top(self):
        if self.size() == 0:
            raise Exception('top - stack underflow')
        return self.arr[-1]

    def __str__(self):
        return np.array_str(self.arr)

请注意,我添加了一些有关limit的功能,但limit的默认值为0,表示“无限制”。

由于该类包含size()方法,因此无需在__len()方法中重复相同的代码。

我还添加了一些异常,而不是打印错误消息。

__str__当您打印Stack实例时 ,添加方法以获得任何有意义的结果。

然后,如果你运行你的主代码,结果是:

4
[11. 11. 11. 11. 10. 20. 30.]

但是,如果您创建您的Stack实例,例如myStack = Stack(3) (将限制设置为非零值),那么在某些时候您将获得Exception: push - Limit exceeded


推荐阅读