NumPy:如何制作包含 x 输入和 f(x) 输出的二维数据数组(使用运动学示例)

NumPy: How to make a 2-dim data array containing both x inputs and f(x) outputs (using example of kinematics)

尝试制作一个简单的运动学阵列(为了好玩!)其中

  1. 系统提示您输入一个确定 t = [0, tmax]
  2. 的 int 输入 tmax

所以这意味着如果您输入 tmax = 5,则时间间隔将为 t = [0, 5] 秒

  1. 系统会提示您输入浮点输入 jerkc(位置的三阶导数),它确定用于计算加速度 (jerkc * t)、速度 (jerkc * 1/2 * t^2) 和位置的常量。

我正在尝试使用 NumPy(我对此非常陌生,python)创建一个二维数组,其中:

第 1 行:时间(因此对于 tmax = 5,此行将是:[0, 1, 2, 3, 4, 5])

第 2 行:加速度 (t)(因此对于 tmax = 5,Jerkc = 2,此行将是 [0, 2, 4, 6, 8, 10]

第 3 行:速度 (t)(依此类推...)

第 4 行:position(t)(依此类推......)

我对列表仍然很不熟悉——尤其是 NumPy 数组。我习惯了 Java 数组,如果你想知道为什么我要这样处理这个数组。这是我目前所拥有的示例:

import numpy as np

tmax = int(input('Please enter a timeframe [0, t] [int]: '))
print('Thank you! Your timeframe will be [0, ', tmax, ']!')
jerkc = float(input('Please enter a jerk constant [float]: '))
print('Thank you! Your jerk constant will be ', jerkc, '!')

physics = np.array([[], [], [], []])


t = int(0)
i = int(0)
m = int(0)
e = int(0)

while (t <= tmax):
    physics[0, t] = t
    t = t + 1
while (i <= tmax):
    physics[1, t] = (jerkc * t)
    t = t + 1
while (m <= tmax):
    physics[2, t] = ((jerkc) * (1/2) * (t ^ 2))
    t = t + 1
while (e <= tmax):
    physics[3, t] = ((jerkc) * (1/2) * (1/3) * (t ^ 3))

print(physics)

如果有人知道我做错了什么,或者可以向我解释我可以更好地使用数组的方法,请告诉我,并请仔细和理解地解释自己!谢谢!

NumPy 数组的特别之处在于您可以用它进行计算。这意味着如果您将 2 个数组相乘,结果数组将包含这些数组的值与彼此相乘。
如本例所示:

>>> array1=array([1,2,3,4])
>>> array2=array([5,6,7,8])
>>>
>>> array1 * array2
array([ 5, 12, 21, 32])

这也适用于加法、减法、除法...

NumPy 的另一大优点是 arange 函数。它的工作方式类似于 python 中的 range 函数,但 returns 是一个数组。它具有三个参数:开始、结束和步骤。返回的数组将以 start 参数开头。接下来的项目将与步骤值相加,依此类推。直到下一项大于最终值。
这是一个例子:

>>> arange(1,10)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> arange(1,10,2)
array([1, 3, 5, 7, 9])
>>> arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

注意:不提供step参数时,默认为1,如果只提供一个参数,则从0开始,以该参数结束。

还有一个 zeros 函数。它 returns 给定大小的数组,用零填充。最好以这种方式初始化数组。

>>> zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
>>> zeros((2,2))
array([[0., 0.],
       [0., 0.]])

最后,正如 python 中几乎所有可索引对象一样,NumPy 数组都支持切片。它以 array[start:end] 的方式工作。它 returns 从索引开始到结束之前的索引的数组部分。如果省略 start,则结果将从数组的开头到索引结尾。 end 参数也是如此。如果两者都省略 (:),则结果只是整个数组。此外,可以提供第三步值 array[start:end:step]。这与 arange 的工作方式相同,结果值的索引将从头开始计算。
一个例子:

>>> array1=array([1,2,3,4,5,6,7,8,9,10])
>>>
>>> array1[2:4]
array([3, 4])
>>> array1[:4]
array([1, 2, 3, 4])
>>> array1[2:]
array([ 3,  4,  5,  6,  7,  8,  9, 10])
>>> array1[:]
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
>>> array1[5:9:3]   #with step value
array([6, 9])

由于 NumPy 更喜欢所有维度都有一个索引,我们将使用 physics[1,:] 告诉 NumPy 我们想要更改数组中的所有值。

如果我们使用前面提到的东西重写您的代码,它看起来像:

import numpy as np

tmax = int(input('Please enter a timeframe [0, t] [int]: '))
print('Thank you! Your timeframe will be [0, ', tmax, ']!')
jerkc = float(input('Please enter a jerk constant [float]: '))
print('Thank you! Your jerk constant will be ', jerkc, '!')

physics = np.zeros((4,tmax+1))

physics[0, :] = np.arange(tmax+1)#+1, as the end is not included in the array.
physics[1, :] = physics[0, :] * jerkc
physics[2, :] = ((jerkc) * (1/2) * (physics[0, :] ** 2))
physics[3, :] = ((jerkc) * (1/2) * (1/3) * (physics[0, :] ** 3))

注意: **是python中的幂运算符,^是异或,所以不会起作用。