我正在尝试这样做,但这总是错误的。我不知道我该怎么做...这是我的代码:
class WrongStack:
def __init__(self):
self.__items = numpy.array([])
def push(self, item):
numpy.concatenate(self.__items,item)
def pop(self):
return numpy.delete(self.__items,0,-1)
def peek(self):
return self.__items[len(self.__list) - 1]
def is_empty(self):
return len(self.__items) == 0
def size(self):
return len(self.__items)
s = WrongStack()
number = input('Choose a number, 0 to finish')
while number != '0':
s.push(numpy.array([nmr]))
number = input('Choose a number, 0 to finish')
while not s.is_empty():
number = s.pop()
print(number)
错误是:
File "C:/Users/JJ/OneDrive - ISCTE-IUL/EDA/Aula 4.py", line 55, in <module>
s.push(numpy.array([nmr]))
File "C:/Users/JJ/OneDrive - ISCTE-IUL/EDA/Aula 4.py", line 38, in push
numpy.concatenate(self.__items,item)
File "<__array_function__ internals>", line 6, in concatenate
TypeError: only integer scalar arrays can be converted to a scalar index
我知道这不是如何构建普通堆栈,但是我必须以这种方式进行。
对代码进行了修改以使其正常工作。
在我更改代码的位置放置“ Mod”。
代码
import numpy as np
class WrongStack:
def __init__(self):
self.__items = np.array([])
def push(self, item):
# Mod--concatenate takes list contains items to concatenate
self.__items = np.concatenate([self.__items,item])
def pop(self):
# Mod--np.delete returns a new array
# also retrieve last element before delete
last = self.__items[-1]
self.__items = np.delete(self.__items,-1, 0)
return last
def peek(self):
return self.__items[len(self.__list) - 1]
def is_empty(self):
# Mod--use function size
return self.size() == 0
def size(self):
return len(self.__items)
def __str__(self):
# Mod--added for display the array
return str(self.__items)
s = WrongStack()
number = input('Choose a number, 0 to finish: ')
while len(number) > 0 and number != '0': #Mod done if no input or '0' entered
# Mod--convert numer to integer
s.push(np.array([number], dtype=np.int32)) # specify type (i.e. int32)
number = input('Choose a number, 0 to finish: ')
# Mod--print array created
print('Array created:', s)
while not s.is_empty():
number = s.pop()
print('number: ', number)
Test
Choose a number, 0 to finish: 1
Choose a number, 0 to finish: 2
Choose a number, 0 to finish: 3
Choose a number, 0 to finish: 4
Choose a number, 0 to finish: 5
Choose a number, 0 to finish: 0
Array created: [1. 2. 3. 4. 5.]
number: 5.0
number: 4.0
number: 3.0
number: 2.0
number: 1.0
替代
依赖于Numpy固定大小的数组。使用切片和范围检查来确保我们保持在分配的大小内。
import numpy as np
class WrongStack:
def __init__(self, maxlen=100):
self.__items = np.array([0]*maxlen) # Fixed size Numpy array
self._count = 0
self._maxlen = maxlen
def push(self, item):
# Mod--concatenate takes list contains items to concatenate
if self._count < self._maxlen:
self.__items[self._count] = item
self._count += 1
else:
print('push: no more space')
def pop(self):
# Mod--np.delete returns a new array
# also retrieve last element before delete
if self._count > 0:
last = self.__items[self._count-1]
self._count -= 1
return last
else:
return None
def peek(self):
if self._count > 0:
return self.__items[self._count-1]
else:
return None
def is_empty(self):
# Mod--use function size
return self.size() == 0
def size(self):
return self._count
def __str__(self):
# Mod--added for display the array
return str(self.__items[:self._count])
s = WrongStack(10) # will handle stack with up to 10 elements
number = input('Choose a number, 0 to finish: ')
while len(number) > 0 and number != '0': #Mod done if no input or '0' entered
# Mod--convert numer to integer
s.push(number) # specify type (i.e. int32)
number = input('Choose a number, 0 to finish: ')
# Mod--print array created
print('Array created:', s)
while not s.is_empty():
number = s.pop()
print('number: ', number)
您正在尝试将numpy数组用作堆栈,这可能无法如您所愿。 numpy数组设计用于数学计算,而不是用作通用数据结构。
相反,只是使用Python列表来实现您的堆栈。实际上,Python文档甚至包括有关如何执行此操作的a section:
>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]