&引用;只有长度为1的数组才能转换为Python标量-浮点转换函数出错

&引用;只有长度为1的数组才能转换为Python标量-浮点转换函数出错,python,arrays,numpy,vector,Python,Arrays,Numpy,Vector,运行此程序时,我收到错误“TypeError:只有长度为1的数组才能转换为Python标量”,具体指的是第9行,其中分配了x1变量 我在这里有点不知所措,这在这里意味着什么。在上一次作业中,我使用了一段非常相似的代码,在那里一切都很好。我将向量作为函数的参数,同时计算所有值 注意:在我移除浮动后,它似乎工作正常,但我不知道为什么。有人能解释一下吗 import matplotlib.pyplot as plt import numpy as np g = 9.78 p = 1000 h = 50

运行此程序时,我收到错误“TypeError:只有长度为1的数组才能转换为Python标量”,具体指的是第9行,其中分配了x1变量

我在这里有点不知所措,这在这里意味着什么。在上一次作业中,我使用了一段非常相似的代码,在那里一切都很好。我将向量作为函数的参数,同时计算所有值

注意:在我移除浮动后,它似乎工作正常,但我不知道为什么。有人能解释一下吗

import matplotlib.pyplot as plt
import numpy as np
g = 9.78
p = 1000
h = 50
s = 7.9 * 10**-2

def water_wave_speed(l):
  x1 = float(g * l/(2 * np.pi))
  x2 = 1 + s * float((4 * np.pi**2)/(p * g * l**2))
  x3 = float((2 * np.pi * h)/l)
  c = np.sqrt(x1 * x2 * np.tanh(x3))
  return c

l_values = np.linspace(0.001, 0.1, 10)
c_values = water_wave_speed(l_values)
plt.plot(l_values, c_values)
plt.show()

放下所有的
float
调用,你的代码应该可以工作(作为float)。您试图将numpy数组强制为单浮点值,但这是行不通的。

使用
np.float
而不是
float
。这有帮助吗?@AndrasDeak
np.float==float
您希望在这段代码中
float
调用做什么?据我所见,它传递的参数将始终是一个浮点数或浮点数数组(因为您正在乘以
np.pi
)。@MosesKoledoye您是对的,谢谢。直到我读了你的答案,我才意识到这种方法的奇怪,直到那时它才显得简单:)显然,当你需要它时,你需要
.astype(float)
。在Python 2中,只有当
/
运算符的两边都是整数时,才会发生整数除法。如果其中任何一个已经是浮点,则得到浮点除法。因此,由于您在所有计算中都使用了
np.pi
,因此不必担心它。在Python3中,用
/
除以两个整数进行浮点除法,您需要使用
/
专门请求整数除法。这一点很好,但我认为这应该是一个注释。我明白了。你能更全面地解释最后一部分吗?我不明白在这种情况下,传递给float()的参数如何是数组。我认为,当我在Python中进行这样的函数调用时,它将遍历数组的单个值,并在幕后逐个计算它们。正如在对您的问题的评论中所述,计算涉及
np.pi
,这会将结果保持为浮点数,数组的元素将作为浮点数返回。函数调用并不像您所期望的那样对数组的每个项都执行。它只是尝试将数组转换为float@user4612744:数组没有比作为函数参数传递时发生的任何魔力。就普通函数而言,数组只是另一个参数。您可以使用
numpy.vectorize
将需要标量参数的函数转换为与数组一起工作的函数,但通常情况下它不会这样工作。一些为标量编写的函数仍然可以工作,因为像
*
/
这样的数学运算将在数组的值上“广播”该运算(如果任意一侧是数组)。
float
接受一个数字或字符串并返回一个值
float([1,2,3])
给出一个错误;
浮动('1.23 34.4')也是如此。
。接受iterable的函数将数组视为平面列表。委托给参数方法的函数也可以工作(例如,
str()
)。否则,您需要使用
numpy
aware函数。