将浮点数乘以 Python 中的函数并且无法将序列乘以“浮点”类型的非整数

Posted

技术标签:

【中文标题】将浮点数乘以 Python 中的函数并且无法将序列乘以“浮点”类型的非整数【英文标题】:Multiplying a float Number to a Function in Python and getting can't multiply sequence by non-int of type 'float' 【发布时间】:2021-05-29 00:54:45 【问题描述】:

我有以下用 python 2.7 编写的代码。 这里我定义了两个函数,一个余弦函数和一个指数函数 我需要将这些函数乘以一个浮点值,但我收到了这个错误。 我假设我们不能将浮点值乘以list() 格式的函数... 如果有人告诉我该怎么做,我将不胜感激。 提前致谢。 这是我的代码:

import numpy as np
import math
import cmath

delta  = 2.0*math.pi*1.46*((1.0/1530)-(1.0/1550))

#defining main func
def apFunc(x):
    return np.exp(-4*math.log(2)*((x-(5/2))/5)**2)*(1+math.cos((2*math.pi/0.001)*x))
Domain = list(np.arange(0,5,0.001))
APF    = map(apFunc,Domain)

#defining modulation function 
def modFunc(x):
    return (1+math.cos((2*math.pi/0.001)*x))
d      = list(np.arange(0,5,0.001))
mod    = map(modFunc,d)

#making sig and kaa functions
sgima  = (2*math.pi/1530)*APF
sig    = sigma + delta
kaa    = (math.pi/l1530)*mod
gamma  = math.sqrt(sig**2 + kaa**2)

【问题讨论】:

对于列表,*+ 不是数学运算,它们重复并加入列表。可以对多个元素进行数学运算的是 numpy 数组。还要注意math 函数只能作用于单个数字,而不是列表或数组。 如果您将此代码移至 Python3(当前),则需要更改 map 的使用。 我看到了math.cos()math.pi 等。不坚持使用 numpy 有什么具体原因吗?这将自行解决您的问题。 为什么在同一个表达式中使用np.expmath.log 谢谢先生问题解决了,一旦我更改了代码并得到相同的错误,但后来我只看到了一个数学。 s 被遗忘了 :-) 【参考方案1】:

坚持使用 NumPy(特别是完全避免 math/cmath)将通过完全避免非广播友好的容器/操作来解决您观察到的问题:

import numpy as np


delta = 2.0 * np.pi * 1.46 * ((1.0 / 1530) - (1.0 / 1550))


def apFunc(x):
    return np.exp(-4 * np.log(2) * ((x - (5 / 2)) / 5) ** 2) * (
        1 + np.cos((2 * np.pi / 0.001) * x)
    )


def modFunc(x):
    return 1 + np.cos((2 * np.pi / 0.001) * x)


d = np.linspace(0.0, 5.0, 5000)
APF = apFunc(d)
mod = modFunc(d)

# making sig and kaa functions
sigma = (2 * np.pi / 1530) * APF
sig = sigma + delta
kaa = (np.pi / 1530) * mod
gamma = np.sqrt(sig ** 2 + kaa ** 2)

(我还在这里和那里修正了一些错别字,并稍微清理/重新排序,虽然它还没有完全符合PEP8-compliant)

请注意,我已将 np.arange() 的使用替换为对 np.linspace() 的等效调用,因为根据其文档:“当使用非整数步长时,例如 0.1,结果通常会不一致。对于这些情况,最好使用 numpy.linspace。"

【讨论】:

谢谢norok2这解决了问题,但是你为什么用np.linspacee()而不是np.arange()?? "当使用非整数步长时,例如0.1,结果往往会不一致。这些情况最好使用numpy.linspace。"之所以如此,是因为如果步骤没有准确表示,一遍又一遍地求和只会导致错误累积,这可能会导致结果不一致(一个数据点与您对精确数学的预期不同)。 @VahidTalebi 另见How to use a decimal range() step value? 现在我正在添加另一个元素 deltz = (5*(10.0**6))/50 f11=complex(np.cosh(gamma*deltz),-(sig/gamma)*np.sinh(gamma*deltz)) 并收到此错误 only length-1 arrays can be converted to Python scalars 同样的问题。只需使用x + 1j * y 而不是complex(x, y)【参考方案2】:

哇,里面有很多。

友好的提示 - 提供堆栈跟踪可以更轻松地为您提供帮助,就像将代码减少到重要部分一样。

针对您的实际问题-

模组是map(modFunc,d)

map 返回一个列表,所以mod = [..., ...] 然后 kaa = (pi) * mod

(pi) * [..., ...]

这没有多大意义。您可能也想要那里的地图?

【讨论】:

感谢亲爱的保罗的提示和回答。我在这里只需要制作'''sig'''和'''kaa''',正如你所说的那样,我有这两个地图功能是列表的形式。也许我需要将 sig 和 kaa 定义为 map??? 我不知道你到底想做什么 :) 我所知道的是你不能将一个列表乘以一个浮点数(而将它乘以一个 int 就不是你想要的了无论如何都想要)。如果您想要的是“将此列表的每个值乘以该值并将结果存储在新列表中”,则映射将是正确的选择。 感谢 Paul,我刚刚将所有数学库更改为 numpy,问题解决了

以上是关于将浮点数乘以 Python 中的函数并且无法将序列乘以“浮点”类型的非整数的主要内容,如果未能解决你的问题,请参考以下文章

在 Objective C 中,将浮点数乘以 100 有时会产生一个稍微出乎意料的结果

如何将浮点数转换为长度为 4 的字节数组(char* 数组)?

Python“ValueError:无法将字符串转换为浮点数:%”

将浮点数转换为字符串

将浮点数与数组中的值进行比较时,“TypeError:只能将整数标量数组转换为标量索引”

Python如何将浮点数作为十六进制转换为十进制