使用NumPy将数字附加到矢量

时间:2015-04-24 12:04:13

标签: python arrays numpy vector scipy

我想用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保持为空。

2 个答案:

答案 0 :(得分: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)

*如果 尝试就地修改内容,第一个问题会更糟,因为那时你会尝试修改不可变的单例值{{1} } ...

**对于非常大的数组,请不要使用None,因为构建临时list的成本太高。相反,您经常需要创建生成器或其他类型的惰性迭代器,并使用list

答案 1 :(得分:0)

就像这样:

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