Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使for循环在只有一个元素的数组(0-d数组)上迭代_Python_Arrays_Numpy - Fatal编程技术网

Python 如何使for循环在只有一个元素的数组(0-d数组)上迭代

Python 如何使for循环在只有一个元素的数组(0-d数组)上迭代,python,arrays,numpy,Python,Arrays,Numpy,我有一个函数,它接受一个参数y\u 0,该参数可能是一个列表或数组,也可能只是一个浮点数。我希望它能在y\u 0是单个浮点的情况下工作,所以我尝试在下面的代码中使用np.asarray(y\u 0),这样,如果只有一个项,循环仍然可以工作。然而,我得到了错误TypeError:0-d数组上的迭代。我可以使用if语句来检查它是否为单例,并采取适当的措施。然而,我很好奇是否有一种方法可以使它在单个对象上迭代 def vf_grapher(fn, t_0, t_n, dt, y_0, lintype=

我有一个函数,它接受一个参数
y\u 0
,该参数可能是一个列表或数组,也可能只是一个浮点数。我希望它能在
y\u 0
是单个浮点的情况下工作,所以我尝试在下面的代码中使用
np.asarray(y\u 0)
,这样,如果只有一个项,循环仍然可以工作。然而,我得到了错误
TypeError:0-d数组上的迭代
。我可以使用if语句来检查它是否为单例,并采取适当的措施。然而,我很好奇是否有一种方法可以使它在单个对象上迭代

def vf_grapher(fn, t_0, t_n, dt, y_0, lintype='-r', sup_title=None,
               title=None, xlab=None, ylab=None):

    t = np.arange(t_0, t_n, dt)
    y_min = .0
    y_max = .0

    fig, axs = plt.subplots()
    fig.suptitle(sup_title)

    axs.set_title(title)
    axs.set_ylabel(ylab)
    axs.set_xlabel(xlab)

    for iv in np.asarray(y_0):
        soln = rk4(dt, t, fn, iv)
        plt.plot(t, soln, lintype)
        if y_min > np.min(soln):
            y_min = np.min(soln)
        if y_max < np.max(soln):
            y_max = np.max(soln)

我不确定为什么可以迭代单个对象的列表,但不能迭代单个对象的数组,但我找到了一种方法,可以在对不同问题的回答中确定某个项是否可编辑:

然后,我使用了一个try,除了如下所示的block:

try:
    iter(y_0)
except TypeError:
    y_0 = list([y_0])

for iv in y_0:
    soln = rk4(dt, t, fn, iv)
    plt.plot(t, soln, lintype)
    if y_min > np.min(soln):
        y_min = np.min(soln)
    if y_max < np.max(soln):
        y_max = np.max(soln)
试试看:
国际热核实验堆(y_0)
除类型错误外:
y_0=列表([y_0])
对于y_0中的iv:
soln=rk4(dt,t,fn,iv)
plt.绘图(t、soln、lintype)
如果y_min>np.min(soln):
y_min=np.min(soln)
如果y_max

谢谢大家的宝贵意见。

我不知道为什么您可以迭代单个对象的列表,但不能迭代单个对象的数组,但我找到了一种方法来确定一个项目是否可用于回答另一个问题:

然后,我使用了一个try,除了如下所示的block:

try:
    iter(y_0)
except TypeError:
    y_0 = list([y_0])

for iv in y_0:
    soln = rk4(dt, t, fn, iv)
    plt.plot(t, soln, lintype)
    if y_min > np.min(soln):
        y_min = np.min(soln)
    if y_max < np.max(soln):
        y_max = np.max(soln)
试试看:
国际热核实验堆(y_0)
除类型错误外:
y_0=列表([y_0])
对于y_0中的iv:
soln=rk4(dt,t,fn,iv)
plt.绘图(t、soln、lintype)
如果y_min>np.min(soln):
y_min=np.min(soln)
如果y_max

谢谢大家的宝贵意见。

您可以使用
ndmin
参数
np.array
来确保您的数组实际上是可编辑的:

np.array(y_0, ndmin=1, copy=False)
np.asarray
只是
np.array
的别名,它以不同的方式设置一些默认参数

ndmin
可用于用单位尺寸填充形状。这很有帮助,因为通常零维数组相当于标量。这样做的一个恼人的副作用是它们无法忍受
ndmin=1
意味着标量输入应被视为一维、单元素数组,这正是您需要的


copy=False
只是告诉numpy按原样使用现有数组,而不是复制。这样,如果用户传入一个实际数组(与列表或标量相反),则将使用该数组而不会产生数据重复。我经常将此参数与
subok=True
配对,后者也将通过
ndarray
的子类而不进行复制。

您可以使用
ndmin
参数对
np.array
来确保您的数组实际上是可重用的:

np.array(y_0, ndmin=1, copy=False)
np.asarray
只是
np.array
的别名,它以不同的方式设置一些默认参数

ndmin
可用于用单位尺寸填充形状。这很有帮助,因为通常零维数组相当于标量。这样做的一个恼人的副作用是它们无法忍受
ndmin=1
意味着标量输入应被视为一维、单元素数组,这正是您需要的


copy=False
只是告诉numpy按原样使用现有数组,而不是复制。这样,如果用户传入一个实际数组(与列表或标量相反),则将使用该数组而不会产生数据重复。我经常将此参数与
subok=True
配对,它也将通过
ndarray
的子类而不进行复制。

编写一个接受列表或数组的函数,并让用户负责传递
[y\u 0]
作为参数。在迭代之前,尝试将
y\u 0
转换为
列表
。我使用np.asarray进行了尝试。在这种情况下,实际的列表可能比数组更有效……有一个简单得多的解决方案,OP似乎是一个使用
try
的好地方,除了
块。编写一个接受列表或数组的函数,并让用户负责传递
[y\u 0]
作为参数。在迭代之前,尝试将
y\u 0
转换为
列表
。我使用np.asarray进行了尝试。也许在这种情况下,一个实际的列表比一个数组更有效……有一个更简单的解决方案,OP似乎是一个使用
try
的好地方,除了
块。所以,这很有效,但给我留下了两个问题。。。1.)当我调用np.array(y_0)时,为什么维度默认设置为零?2.)何时需要复印件?rocksnWaves说:“我不太了解记忆以及所有这些是如何工作的,但这与记忆有关系吗?”。你永远都不需要拷贝,numpy对待标量很奇怪。这就是Arg们所做的一切。我更新了我的答案,提供了更多的细节。所以,这很有效,但给我留下了两个问题。。。1.)当我调用np.array(y_0)时,为什么维度默认设置为零?2.)何时需要复印件?rocksnWaves说:“我不太了解记忆以及所有这些是如何工作的,但这与记忆有关系吗?”。你永远都不需要拷贝,numpy对待标量很奇怪。这就是Arg们所做的一切。我已经用更多的细节更新了我的答案。