【问题标题】:Append numbers to vectors with NumPy使用 NumPy 将数字附加到向量
【发布时间】:2015-07-03 00:48:46
【问题描述】:

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

【问题讨论】:

    标签: python arrays numpy vector scipy


    【解决方案1】:

    这里有三个问题。

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

    【讨论】:

    • 一次向数组添加一个数字是np.append 最糟糕的应用。这是列表追加的情况,而不是数组近似值。
    • @hpaulj:同意,但这是 OP 要求的。您是否认为需要扩展答案以解释您应该将数组视为固定大小的预分配集合,而不是将它们视为像列表这样的扩展集合,并向他展示做他想做的更好的方法? (从 2 个元素的列表开始,而不是空的,然后填充它们,构建一个列表,然后在需要时转换为数组,或者将两个表达式放入一个数组构造函数中。)
    • 是的,直接回答问题和鼓励不良做法之间存在矛盾。我有点希望他们没有添加np.append,因为初学者经常滥用它。
    【解决方案2】:

    就像这样:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 2020-11-16
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      相关资源
      最近更新 更多