这里有三个问题。
首先,None 不是一个数组,所以附加到它上面没有任何意义。 (NumPy 实际上会让你这样做,但它会将其视为array([None], dtype=object),这几乎肯定不是你想要的。)
其次,append 不会就地修改其数组参数,它会返回一个新数组。* 正如文档所说:
arr 的副本,其中 values 附加到 axis。请注意,append 不会就地发生:分配并填充了一个新数组。
另外,你真的应该在创建数组时设置它的 dtype;否则,您将获得默认的 float64,而 NumPy 会将所有漂亮的整数浪费地转换为浮点数。
所以,做你想做的事:
positions = np.array([], dtype=int)
forces = np.array([], dtype=int)
# append
positions = np.append(positions, int(input("Please input position: ")))
forces = np.append(forces, int(input("Please input position: ")))
# print positions and forces
print(positions)
print(forces)
第三,NumPy 数组并不意味着一次增长一个元素。这个问题不会导致您的错误——对于这么小的数组(大小(1,)),它甚至不会产生明显的影响——但这是一个非常糟糕的习惯。许多其他类型,如 Python 的内置列表,都适用于此,但不是 NumPy 数组。
通常,您可以提前知道要拥有多少个值,在这种情况下,您可以预先分配数组。如果不是,您通常会从某种动态构建的可迭代对象中构建它,例如 list。** 以下是一些示例:
# Pre-allocating the array
positions = np.zeros((1,), dtype=int)
positions[0] = int(input("Please input position: "))
# Building the array from a dynamically-built list
positions = []
positions.append(int(input("Please input position: ")))
positions = np.array(positions, dtype=int)
# Building the array all at once from a static list
positions = np.array([int(input("Please input position: "))], dtype=int)
* 如果它确实 尝试就地修改内容,第一个问题会更糟,因为那时您将尝试修改不可变的单例值None...
** 对于非常大的数组,不要使用list,因为构建临时list 的成本会太高。相反,您通常希望创建一个生成器或其他类型的惰性迭代器,并使用np.fromiter。