你这里有三个问题。
首先,None
不是一个数组,所以追加到它没有任何意义。 (NumPy的实际上将让你这样做,但它通过将其视为array([None], dtype=object)
,这是几乎可以肯定不是你想要的这样做。)
其次,append
不会修改就地其数组参数,它返回新阵列。 *作为文档说:
的ARR副本具有附加到轴线值。请注意,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
。
一次向数组中添加一个数字是'np.append'最糟糕的应用。这是列表追加的情况,而不是数组近似。 – hpaulj
@hpaulj:同意,但这是OP要求的。你认为答案需要扩展,以解释你应该将数组看作固定大小的预分配集合,而不是将它们视为扩展集合,如列表,并向他展示更好的方法来做他想做的事情? (从2个元素的列表开始,然后填充它们,构建一个列表,然后根据需要转换为数组,或者只是将这两个表达式放入一个数组构造函数中。) – abarnert
是的,直接回答问题和鼓励糟糕的做法。我有点希望他们没有添加'np.append',因为初学者经常滥用它。 – hpaulj