输入numpy数组到linspace和for循环范围问题

input numpy array to linspace and for loop range problem

我在尝试使用多个值进行测试时遇到问题,因为 for 循环中的 linspace 和 range 不接受数组作为输入。

这是我正在尝试做的一个例子:

gp_input = np.array([31,61])

def var_gp(gp):
   for i in gp:
      x_l = np.linspace(0,3,gp)
      ...
   for i in range(gp):
      ...

错误告诉我的内容:

Traceback (most recent call last):

文件“变量 gp.py”,第 306 行,在 var_gp(gp_input)

File "variable gp.py", line 18, in var_gp
    x_l = np.linspace(0,3,gp)
  File "<__array_function__ internals>", line 5, in linspace
  File "/home/rjomega/anaconda3/lib/python3.8/site-packages/numpy/core/function_base.py", line 120, in linspace
    num = operator.index(num)
TypeError: only integer scalar arrays can be converted to a scalar index

如果我只是手动更改 gp 的值并希望我可以插入尽可能多的值来尝试,感觉这将成为一个坏习惯。谢谢。

link to complete code

如果我只是手动更改 gp 的值而不使用 def 函数,它工作正常

如果你也遇到过这种问题,我找到的解决方法:

for i in gp:
       gp = i
          x_l = np.linspace(0,3,gp)
          ...
       for i in range(gp):
          ...

添加 gp = i 似乎可以绕过问题

如果你也遇到过这种问题,我找到的解决方法:

for i in gp:
       gp = i
       x_l = np.linspace(0,3,gp)
          ...
       for i in range(gp):
          ...

添加 gp = i 似乎可以绕过问题

对于数组或列表的 gp,像这样迭代:

In [471]: gp = np.array([3,6])
In [472]: for i in gp:
     ...:     print(i)
     ...:     xi = np.linspace(0,3,i)
     ...:     print(xi)
     ...: 
3
[0.  1.5 3. ]
6
[0.  0.6 1.2 1.8 2.4 3. ]

注意我在调用linspace时使用i,而不是gp

当我们将数组传递给 linspace 时,我们收到您的错误:

In [473]: np.linspace(0,3,gp)
Traceback (most recent call last):
  File "<ipython-input-473-7032efa38f7c>", line 1, in <module>
    np.linspace(0,3,gp)
  File "<__array_function__ internals>", line 5, in linspace
  File "/usr/local/lib/python3.8/dist-packages/numpy/core/function_base.py", line 120, in linspace
    num = operator.index(num)
TypeError: only integer scalar arrays can be converted to a scalar index

一般来说,在 for i in gp: 表达式中,不要在正文中使用 gp。您想要使用迭代变量 i。使用 for 循环的全部意义在于处理 gp 的元素,而不是处理整个循环。

我们也不能使用range中的数组。它必须是数字元素,一次一个:

In [477]: range(gp)
Traceback (most recent call last):
  File "<ipython-input-477-4e92b04fe1fc>", line 1, in <module>
    range(gp)
TypeError: only integer scalar arrays can be converted to a scalar index

In [478]: for i in gp:
     ...:     print(list(range(i)))
     ...: 
[0, 1, 2]
[0, 1, 2, 3, 4, 5]