2015-04-24 50 views
-1

我想用NumPy在某些位置存储多个力。用NumPy将数字附加到矢量

我需要的位置positions矢量和矢量与力forces在某些位置。我提示用户输入这些位置和力量input("Please input position: ")input("Please input force: ")

如何我可以将这些输入值附加与NumPy的两种单独载体?我试过

import numpy as np 

# empty as default 
positions = None 
forces = None 

# append 
np.append(positions, int(input("Please input position: "))) 
np.append(forces, int(input("Please input position: "))) 

# print positions and forces 
print(positions) 
print(forces) 

但变量positionsforces留空。

回答

1

你这里有三个问题。

首先,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

+0

一次向数组中添加一个数字是'np.append'最糟糕的应用。这是列表追加的情况,而不是数组近似。 – hpaulj

+0

@hpaulj:同意,但这是OP要求的。你认为答案需要扩展,以解释你应该将数组看作固定大小的预分配集合,而不是将它们视为扩展集合,如列表,并向他展示更好的方法来做他想做的事情? (从2个元素的列表开始,然后填充它们,构建一个列表,然后根据需要转换为数组,或者只是将这两个表达式放入一个数组构造函数中。) – abarnert

+1

是的,直接回答问题和鼓励糟糕的做法。我有点希望他们没有添加'np.append',因为初学者经常滥用它。 – hpaulj

0

就像这样:

positions = np.array(()) 
positions=np.append(positions, int(input("Please input position: ")))