收数据花式画图plt实战

目录

Python plt想把纵坐标化成对数形式代码

子图ax.

我又有ax scatter,又有ax plot,都要去对数

数字接近0,取对数没有定义,怎么办

创建数据

添加一个小的常数以避免对数未定义的问题

创建一个figure和一个子图ax

在子图ax上绘制线图

在子图ax上绘制散点图

设置子图ax的纵坐标为对数形式

添加图例

显示图像

plot颜色想用六位十六进制怎么写的

plot调节线条粗细

contourf设置颜色条范围代码

让颜色条>某个值的所有都显示同一种颜色, 

plot画虚线

我想设置颜色条为:1,2,3,4,5,6,7,8,9和>10的为同一颜色,

把列表里的数字都变成字符串

numpy每个元素保留六位小数

怎么让numpy每个元素都写成科学计数

结论:自己写循环

plt scatter设置点的透明度

plt scatter设置点的形状

np.log默认底数是e

log(a b)参数意义

arcsin在numpy

numpy.format\_float\_scientific


Python plt想把纵坐标化成对数形式代码

 Python中使用matplotlib库的pyplot模块,将纵坐标设置为对数形式,可以使用plt.yscale()函数,并传递参数'log'。以下是一个简单的例子:

python

复制

import matplotlib.pyplot as plt
import numpy as np# 创建一些数据
x = np.arange(1, 11)
y = np.array([10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000])# 绘制图像
plt.plot(x, y)# 设置纵坐标为对数形式
plt.yscale('log')# 显示图像
plt.show()

在这段代码中,x是横坐标的数据,y是纵坐标的数据。通过调用plt.yscale('log'),纵坐标就被设置成了对数形式。这样,当你的数据在数量级上有很大的差异时,对数坐标可以帮助你更好地观察数据的分布情况。

用户_uBiEPA

子图ax.

ChatGLM

如果你正在使用子图(subplot)并且想要将特定子图的纵坐标设置为对数形式,你可以对那个子图对象调用set_yscale方法。下面是一个例子,展示了如何在子图上设置对数纵坐标:

python

复制

import matplotlib.pyplot as plt
import numpy as np# 创建数据
x = np.arange(1, 11)
y = np.array([10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000])# 创建一个figure和一个子图ax
fig, ax = plt.subplots()# 在子图ax上绘制图像
ax.plot(x, y)# 设置子图ax的纵坐标为对数形式
ax.set_yscale('log')# 显示图像
plt.show()

在这个例子中,fig是整个图形对象,ax是子图对象。我们通过ax.plot来绘制图像,然后通过ax.set_yscale('log')来设置子图的纵坐标为对数形式。最后,我们使用plt.show()来显示整个图形。

用户_uBiEPA

我又有ax scatter,又有ax plot,都要去对数

ChatGLM

如果你

本次回答已被终止

用户_uBiEPA

我又有ax scatter,又有ax plot,都要去对数

ChatGLM

如果你需要在同一个子图上绘制散点图(scatter)和线图(plot),并且都希望将纵坐标设置为对数形式,你可以对同一个子图对象分别调用 plot 和 scatter 方法,然后再设置纵坐标为对数。以下是一个示例:

python

复制

import matplotlib.pyplot as plt
import numpy as np# 创建数据
x = np.arange(1, 11)
y1 = np.array([10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000])
y2 = np.array([1, 20, 300, 4000, 50000, 600000, 7000000, 80000000, 900000000, 1000000000])# 创建一个figure和一个子图ax
fig, ax = plt.subplots()# 在子图ax上绘制线图
ax.plot(x, y1, label='Line Plot')# 在子图ax上绘制散点图
ax.scatter(x, y2, label='Scatter Plot')# 设置子图ax的纵坐标为对数形式
ax.set_yscale('log')# 添加图例
ax.legend()# 显示图像
plt.show()

在这个例子中,y1 和 y2 分别是线图和散点图的纵坐标数据。ax.plot(x, y1) 绘制线图,ax.scatter(x, y2) 绘制散点图。然后,通过 ax.set_yscale('log') 将子图的纵坐标设置为对数形式。最后,ax.legend() 添加图例,plt.show() 显示整个图形。

用户_uBiEPA

数字接近0,取对数没有定义,怎么办

ChatGLM

当数据中包含接近0的值时,直接取对数会导致数学上的未定义问题,因为对数函数在0及其附近是没有定义的。处理这种情况有几种方法:

  1. 过滤数据:移除或替换掉接近0的值。
  2. 添加一个小的常数:在取对数之前,给所有数据值添加一个小的常数,使得它们都大于0。这个常数应该足够小,以避免对数据的整体分布产生显著影响。

以下是一个示例,展示如何通过添加一个小的常数来处理这种情况:

python import matplotlib.pyplot as plt import numpy as np

创建数据

x = np.arange(1, 11) y1 = np.array([10, 100, 1000, 1e-5, 10000, 100000, 1000000, 10000000, 100000000, 1000000000]) y2 = np.array([1, 20, 300, 0.0001, 4000, 50000, 600000, 7000000, 80000000, 900000000])

添加一个小的常数以避免对数未定义的问题

offset = 1e-10 y1 = np.maximum(y1, offset) y2 = np.maximum(y2, offset)

创建一个figure和一个子图ax

fig, ax = plt.subplots()

在子图ax上绘制线图

ax.plot(x, y1, label=‘Line Plot’)

在子图ax上绘制散点图

ax.scatter(x, y2, label=‘Scatter Plot’)

设置子图ax的纵坐标为对数形式

ax.set_yscale(‘log’)

添加图例

ax.legend()

显示图像

plt.show()

在这个例子中,我们使用了 np.maximum 函数来确保所有的y值都至少是 offset 的值,从而避免了对数未定义的问题。这里的 offset 设置为 1e-10,这是一个非常小的常数,足以让所有的y值都大于0,同时又不会对数据的整体分布产生太大影响。

用户_uBiEPA

plot颜色想用六位十六进制怎么写的

ChatGLM

 matplotlib中,你可以使用六位十六进制颜色代码来指定绘图的颜色。六位十六进制颜色代码格式为#RRGGBB,其中RR是红色的两位十六进制数,GG是绿色的两位十六进制数,BB是蓝色的两位十六进制数。

以下是如何在plot函数中使用六位十六进制颜色代码的示例:

python

复制

import matplotlib.pyplot as plt
import numpy as np# 创建一些数据
x = np.arange(1, 11)
y = np.exp(x)# 使用六位十六进制颜色代码绘图
plt.plot(x, y, color='#FF5733')  # 这里的'#FF5733'是一个橙色# 设置纵坐标为对数形式
plt.yscale('log')# 显示图像
plt.show()

在这个例子中,color='#FF5733'指定了线条的颜色为橙色。你可以将'#FF5733'替换为任何你喜欢的六位十六进制颜色代码。

用户_uBiEPA

plot调节线条粗细

ChatGLM

在matplotlib中,你可以通过linewidthlw参数来调节plot函数中线条的粗细。以下是如何设置线条粗细的示例:

python

复制

import matplotlib.pyplot as plt
import numpy as np# 创建一些数据
x = np.arange(1, 11)
y = np.exp(x)# 使用六位十六进制颜色代码绘图,并设置线条粗细为2(这是一个例子,你可以设置为任何你想要的数值)
plt.plot(x, y, color='#FF5733', linewidth=2)  # 或者使用 lw=2# 设置纵坐标为对数形式
plt.yscale('log')# 显示图像
plt.show()

在这个例子中,linewidth=2设置了线条的粗细为2个点。你可以将2替换为任何其他数值来获得不同粗细的线条。数值越大,线条越粗。

contourf设置颜色条范围代码

ChatGLM

在使用matplotlibcontourf函数时,你可以通过vminvmax参数来设置颜色条的显示范围。以下是一个示例代码,展示如何设置颜色条的显示范围:

python

复制

import numpy as np
import matplotlib.pyplot as plt# 生成一些数据
x = np.linspace(-3.0, 3.0, 100)
y = np.linspace(-3.0, 3.0, 100)
X, Y = np.meshgrid(x, y)
Z = np.exp(-X**2 - Y**2)# 创建等高线填充图
plt.figure()
cf = plt.contourf(X, Y, Z, levels=20, cmap='viridis', vmin=0.1, vmax=0.8)# 添加颜色条
plt.colorbar(cf)# 显示图形
plt.show()

在这个例子中,vmin=0.1vmax=0.8设置了颜色条的显示范围,只有在这个范围内的数据会被显示在颜色条上。levels=20设置了等高线的数量,cmap='viridis'设置了颜色映射的样式。

如果你想要根据数据的实际范围来设置颜色条的范围,你可以使用np.min()np.max()来获取数据的最大值和最小值,然后传递给vminvmax参数:

python

复制

vmin = np.min(Z)
vmax = np.max(Z)
cf = plt.contourf(X, Y, Z, levels=20, cmap='viridis', vmin=vmin, vmax=vmax)

这样,颜色条的范围就会根据数据的实际范围来设置。

用户_uBiEPA

为什么我给颜色条设置了范围之后,颜色条上的数字没变成我给的范围,而且从上到下颜色都一样

看起来你在尝试调整颜色条的范围,但可能遇到了一些问题。以下是一些可能的解决方案:

  1. 检查数据范围:确保你提供的vminvmax确实覆盖了你数据的实际范围。你可以打印出数据的最大值和最小值来确认这一点。

    python

    复制

    print(np.min(Z), np.max(Z))
    
  2. 确保颜色映射正确:有时候即使设置了vminvmax,颜色映射也可能没有正确更新。尝试重新创建颜色条或者在创建contourf时明确指定颜色映射。

    python

    复制

    cf = plt.contourf(X, Y, Z, levels=20, cmap='viridis', vmin=vmin, vmax=vmax)
    plt.colorbar(cf, ticks=[vmin, vmax])
    
  3. 检查颜色映射是否支持渐变:某些颜色映射可能在特定的范围内不显示渐变。尝试更换不同的颜色映射,比如'plasma''inferno''magma', 或 'cividis'

    python

    复制

    cf = plt.contourf(X, Y, Z, levels=20, cmap='plasma', vmin=vmin, vmax=vmax)
    
  4. 手动设置颜色条刻度:有时自动生成的颜色条刻度可能不符合预期。你可以手动设置颜色条的刻度和标签。

    python

    复制

    cbar = plt.colorbar(cf)
    cbar.set_ticks([vmin, vmax])
    
  5. 检查是否有其他重叠的颜色条:如果你的图表中有多个颜色条,可能会出现混淆。确保只有一个颜色条与你的contourf相关联。

  6. 刷新图形:在某些情况下,图形可能没有正确刷新。尝试保存图形或使用plt.draw()强制刷新。

    python

    复制

    plt.draw()
    
  7. 检查代码逻辑:确保你的代码中没有其他地方无意中改变了颜色条的范围。

如果你已经尝试了上述步骤仍然有问题,请提供一个简化的代码示例,以便进一步诊断问题所在。

用户_uBiEPA

让颜色条>某个值的所有都显示同一种颜色, 

ChatGLM

要实现颜色条中大于某个特定值的所有部分都显示为同一种颜色,你可以使用matplotlibcolors模块中的Normalize类,并设置一个剪切值。以下是一个例子,其中我们使用matplotlib来创建一个图像,并设置颜色条,使得大于特定值的所有部分都显示为同一种颜色。

python

复制

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import Normalize
from matplotlib.cm import ScalarMappable# 假设这是你的数据
Z = np.random.rand(10, 10) * 10  # 生成一个10x10的随机矩阵# 设置一个剪切值,例如5
vmax = 5# 创建一个归一化对象,剪切值设为vmax
norm = Normalize(vmin=np.min(Z), vmax=vmax, clip=True)# 创建颜色映射
cmap = plt.cm.viridis  # 选择一个颜色映射
cmap.set_over('red')  # 设置超过vmax的颜色为红色# 创建颜色条可映射对象
mappable = ScalarMappable(norm=norm, cmap=cmap)# 绘制图像
plt.imshow(Z, norm=norm, cmap=cmap)# 添加颜色条
plt.colorbar(mappable)# 显示图像
plt.show()

在这段代码中,Normalize类用于设置数据值的归一化范围,其中vmax参数设置了剪切值。cmap.set_over('red')用于设置当数据值超过vmax时使用的颜色。在这个例子中,超过5的所有值都将显示为红色。你可以根据需要更改vmax的值和超过该值时使用的颜色。

用户_uBiEPA

plot画虚线

在matplotlib中,要画虚线,你可以使用plot函数,并通过linestyle参数指定线条样式为虚线。以下是几种常见的虚线样式及其对应的参数值:

  • '--': 短划线
  • '-.': 点划线
  • ':': 点线

以下是一个简单的例子,展示了如何使用plot函数画虚线:

python

复制

import matplotlib.pyplot as plt
import numpy as np# 创建一些数据
x = np.linspace(0, 10, 100)
y = np.sin(x)# 绘制虚线(短划线)
plt.plot(x, y, '--', label='Dashed line')# 如果你想要其他样式的虚线,可以更改linestyle参数
# plt.plot(x, y, '-.', label='Dash-dot line')  # 点划线
# plt.plot(x, y, ':', label='Dotted line')     # 点线# 添加图例
plt.legend()# 显示图形
plt.show()

在这个例子中,我们使用了短划线样式'--'来绘制虚线。你可以根据需要选择不同的虚线样式。

用户_uBiEPA

我想设置颜色条为:1,2,3,4,5,6,7,8,9和>10的为同一颜色,

ChatGLM

要设置颜色条(colorbar)以特定方式显示,你可以使用matplotlib的matplotlib.colors模块中的NormalizeBoundaryNorm类。以下是如何创建一个颜色条,其值分别为1, 2, 3, …, 9,以及大于10的值都显示为同一颜色的示例:

python

复制

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors# 创建数据
data = np.random.randint(1, 12, size=(10, 10))# 定义颜色条的分段边界
clevs = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 定义颜色映射
cmap = plt.get_cmap('viridis', len(clevs) - 1)
# 使用BoundaryNorm创建颜色条的映射
norm = mcolors.BoundaryNorm(clevs, cmap.N, clip=True)# 绘制数据
plt.figure(figsize=(8, 6))
plt.pcolormesh(data, cmap=cmap, norm=norm)# 添加颜色条
cbar = plt.colorbar()
cbar.set_ticks(clevs[:-1])  # 设置颜色条的刻度位置
cbar.set_ticklabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '>10'])  # 设置颜色条的刻度标签# 显示图形
plt.show()

在这段代码中,BoundaryNorm接收两个参数:一个是边界值列表clevs,另一个是颜色映射的颜色数量cmap.NBoundaryNorm会根据这些边界值将数据映射到颜色条上的不同颜色。

注意,颜色映射cmap的颜色数量应该比边界值的数量少一个,因为边界值定义了颜色映射的区间。

最后,通过colorbarset_ticksset_ticklabels方法,我们设置了颜色条的刻度位置和标签。这里,我们将最后一个区间标记为">10",表示所有大于10的值都使用相同的颜色。

用户_uBiEPA

把列表里的数字都变成字符串

ChatGLM

要将列表中的数字转换为字符串,可以使用Python的列表推导式或循环遍历列表中的每个元素,然后使用str()函数将其转换为字符串。以下是两种方法的示例代码:

python

复制

# 假设有一个包含数字的列表
numbers = [0.000000, 0.000015, 0.000030, 0.000045, 0.000060, 0.000075, 0.000090, 0.000105, 0.000120, 0.000135]# 方法1: 使用列表推导式
strings = [str(num) for num in numbers]# 方法2: 使用循环
strings = []
for num in numbers:strings.append(str(num))# 打印转换后的字符串列表
print(strings)

运行上述代码后,你会得到一个包含字符串的新列表,其中每个元素都是原始列表中对应元素的字符串形式。输出结果如下:

复制

['0.0', '0.000015', '0.00003', '0.000045', '0.00006', '0.000075', '0.00009', '0.000105', '0.00012', '0.000135']

请注意,由于浮点数的精度问题,某些数字可能会以不同的格式显示,例如’0.0’而不是’0.000000’。如果你需要保持特定的格式,可以使用format()函数或f-string来指定小数位数。

用户_uBiEPA

numpy每个元素保留六位小数

C NumPy中,可以使用numpy.round()函数或者直接使用数组对象的round()方法来保留数组中每个元素的六位小数。下面是一个示例代码:

python

复制

import numpy as np# 创建一个NumPy数组
arr = np.array([1.123456789, 2.987654321, 3.456789012])# 保留六位小数
arr_rounded = np.round(arr, 6)print(arr_rounded)

这段代码会输出:

复制

[1.123457 2.987654 3.456789]

请注意,round()函数会按照四舍五入的规则来处理小数。如果你想确保小数点后总是有六位数字(即使它们是零),可以使用numpy.set_printoptions()来设置打印选项:

python

复制

import numpy as np# 设置打印选项,确保总是显示六位小数
np.set_printoptions(precision=6)# 创建一个NumPy数组
arr = np.array([1.123456789, 2.987654321, 3.456789012])# 保留六位小数
arr_rounded = np.round(arr, 6)print(arr_rounded)

这将确保打印数组时每个元素都显示六位小数。

用户_uBiEPA

怎么让numpy每个元素都写成科学计数

 NumPy中,要将数组中的每个元素转换为科学计数法表示,可以使用numpy.set_printoptions()函数来设置打印选项,其中formatter参数可以设置为numpy.format_float_scientificnumpy.format_float_positional。下面是如何设置NumPy打印输出为科学计数法的示例:

python

复制

import numpy as np# 创建一个NumPy数组
arr = np.array([1.23456789, 2.3456789, 3456.789])# 设置打印选项,使所有元素以科学计数法显示
np.set_printoptions(formatter={'float': lambda x: format(x, '.6e')})print(arr)

在上面的代码中,.6e指定了格式化为科学计数法,并保留六位小数。lambda函数用于将格式应用于数组中的每个浮点数。

当你运行这段代码时,arr数组中的每个元素都会以科学计数法的形式打印出来,每个数字后面跟着e和相应的指数。

用户_uBiEPA

我不是要打印,我是要转成字符串时

要将NumPy数组中的每个元素转换成科学计数法的字符串表示,可以使用NumPy的numpy.format_float_scientific函数或者使用Python的字符串格式化方法。以下是一个示例代码,演示如何将NumPy数组中的每个元素转换为科学计数法的字符串:

python

复制

import numpy as np# 创建一个NumPy数组
arr = np.array([0.000000, 0.000015, 0.000030, 0.000045, 0.000060, 0.000075, 0.000090, 0.000105, 0.000120, 0.000135])# 将数组中的每个元素转换为科学计数法的字符串
formatted_arr = np.vectorize(lambda x: f"{x:.6e}")(arr)# 输出结果
print(formatted_arr)

在这段代码中,我们首先创建了一个NumPy数组arr。然后,我们使用了np.vectorize来将一个接受单个参数的函数应用到数组的每个元素上。这里的函数是一个lambda表达式,它使用Python的f-string格式化方法将每个元素格式化为具有六位有效数字的科学计数法字符串。

运行上述代码后,formatted_arr将会是一个包含科学计数法字符串的数组,每个元素都是原始数组对应位置元素的科学计数法表示。

结论:自己写循环

用户_uBiEPA

plt scatter设置点的透明度

ChatGLM

在Matplotlib中,使用scatter函数绘制散点图时,可以通过alpha参数来设置点的透明度。alpha参数的值范围从0(完全透明)到1(完全不透明)。

以下是一个简单的例子,展示了如何设置散点图中点的透明度:

python

复制

import matplotlib.pyplot as plt
import numpy as np# 生成一些随机数据
x = np.random.rand(50)
y = np.random.rand(50)# 创建一个散点图,设置点的透明度为0.5
plt.scatter(x, y, alpha=0.5)# 显示图形
plt.show()

在这个例子中,alpha=0.5意味着点的透明度是50%,即半透明。你可以根据需要调整alpha的值来改变透明度。

plt scatter设置点的形状

ChatGLM

在Matplotlib的plt.scatter函数中,你可以使用marker参数来设置散点图中点的形状。以下是一些可用的标记选项:

  • '.' 点
  • ',' 像素
  • 'o' 圆圈
  • 'v' 倒三角
  • '^' 正三角
  • '<' 左三角
  • '>' 右三角
  • '1' 下箭头
  • '2' 上箭头
  • '3' 左箭头
  • '4' 右箭头
  • 's' 正方形
  • 'p' 五角星
  • '*' 星号
  • 'h' 六边形1
  • 'H' 六边形2
  • '+' 加号
  • 'x' 乘号
  • 'D' 菱形
  • 'd' 瘦菱形
  • '|' 竖线
  • '_' 横线

以下是一个示例,展示了如何设置散点图中点的形状:

python

复制

import matplotlib.pyplot as plt
import numpy as np# 生成一些随机数据
x = np.random.rand(50)
y = np.random.rand(50)# 创建一个散点图,设置点的形状为正方形
plt.scatter(x, y, marker='s')# 显示图形
plt.show()

在这个例子中,marker='s'指定了点的形状为正方形。你可以根据需要更改marker参数的值来选择不同的形状。

用户_uBiEPA

np.log默认底数是e

ChatGLM

NumPy中的np.log函数默认使用自然对数,即底数是欧拉数e(大约等于2.71828)。如果你想要使用其他底数的对数,可以使用np.log2(底数为2)或np.log10(底数为10)等函数。

用户_uBiEPA

log(a b)参数意义

ChatGLM

在数学和计算机编程中,log(a, b) 函数通常表示以a为底数的对数,其参数意义如下:

  • a:这是对数的底数,表示你要计算的是以a为底的对数。
  • b:这是对数的真数,即你想要计算对数的那个数。

所以,log(a, b) 的意思是计算“ba的多少次幂”,或者说“以a为底,b的对数是多少”。

在Python的NumPy库中,你可以使用numpy.log(b)来计算自然对数(底数为e),如果你想要计算以a为底数的对数,可以使用numpy.log(b) / numpy.log(a),因为对数的换底公式是:

复制

log_a(b) = log_c(b) / log_c(a)

其中log_c表示以c为底的对数,可以是任何底数,包括自然对数log_e

例如,如果你想计算以10为底数,100的对数,可以这样写:

python

复制

import numpy as np# 计算 log10(100)
result = np.log(100) / np.log(10)
print(result)  # 输出结果应该是 2

在这个例子中,10010的平方,所以以10为底数100的对数是2

用户_uBiEPA

:\Users\lenovo\AppData\Local\Temp/ipykernel_26388/1713399377.py:57: RuntimeWarning: invalid value encountered in log ax.scatter(x.detach().numpy(),np.log(1e-2+model1(x_i).detach().numpy()),label='MLP-predict',c='b',s=20,marker='<')#,c='y',s=15) C:\Users\lenovo\AppData\Local\Temp/ipykernel_26388/1713399377.py:58: RuntimeWarning: invalid value encountered in log ax.scatter(x.detach().numpy(),np.log(1e-2+model2(x_i).detach().numpy()),label='KAN-predict',c='r',s=20,marker='x')#,c='r',s=15) C:\Users\lenovo\AppData\Local\Temp/ipykernel_26388/1713399377.py:59: RuntimeWarning: invalid value encountered in log ax.plot(x.detach().numpy(),np.log(1e-2+sol_fun(x_i).detach().numpy()),label='true',c='g',lw=2.5,linestyle=':') C:\Users\lenovo\AppData\Local\Temp/ipykernel_26388/1713399377.py:57: RuntimeWarning: invalid value encountered in log ax.scatter(x.detach().numpy(),np.log(1e-2+model1(x_i).detach().numpy()),label='MLP-predict',c='b',s=20,marker='<')#,c='y',s=15) C:\Users\lenovo\AppData\Local\Temp/ipykernel_26388/1713399377.py:58: RuntimeWarning: invalid value encountered in log ax.scatter(x.detach().numpy(),np.log(1e-2+model2(x_i).detach().numpy()),label='KAN-predict',c='r',s=20,marker='x')#,c='r',s=15) C:\Users\lenovo\AppData\Local\Temp/ipykernel_26388/1713399377.py:59: RuntimeWarning: invalid value encountered in log ax.plot(x.detach().numpy(),np.log(1e-2+sol_fun(x_i).detach().numpy()),label='true',c='g',lw=2.5,linestyle=':')怎么回事

展开

ChatGLM

你遇到的警告信息 “RuntimeWarning: invalid value encountered in log” 表示在计算对数的过程中,np.log 函数遇到了无效的输入值。对数函数 np.log 只能接受正数值作为输入,因为对负数或零取对数是没有定义的。

在你的代码中,问题出现在这一行:

python

复制

np.log(1e-2 + model1(x_i).detach().numpy())

这里,你试图对 1e-2 + model1(x_i).detach().numpy() 的结果取对数。警告表明 1e-2 + model1(x_i).detach().numpy() 的某些值可能是非正数(即零或负数),这导致了对数函数无法正确计算。

为了解决这个问题,你可以采取以下步骤:

  1. 检查 model1(x_i).detach().numpy() 和 model2(x_i).detach().numpy() 的输出,确保它们都是正数。
  2. 在取对数之前,添加一个小的正常数(如 1e-2)以避免零值,但需要确保这个小的正常数足以使所有的值都变为正数。

以下是一些建议的解决方案:

python

复制

import numpy as np# 假设 x_i 和 model1, model2 已经定义
x = x.detach().numpy()
model1_output = model1(x_i).detach().numpy()
model2_output = model2(x_i).detach().numpy()
sol_fun_output = sol_fun(x_i).detach().numpy()# 确保 model1_output, model2_output 和 sol_fun_output 都大于 0
epsilon = 1e-2
model1_positive = np.maximum(model1_output, epsilon)
model2_positive = np.maximum(model2_output, epsilon)
sol_fun_positive = np.maximum(sol_fun_output, epsilon)# 现在取对数应该不会出现警告
ax.scatter(x, np.log(model1_positive), label='MLP-predict', c='b', s=20, marker='<')
ax.scatter(x, np.log(model2_positive), label='KAN-predict', c='r', s=20, marker='x')
ax.plot(x, np.log(sol_fun_positive), label='true', c='g', lw=2.5, linestyle=':')

在这段代码中,np.maximum 函数确保了所有的值至少是 epsilon,这样在取对数时就不会遇到无效的输入值。如果 epsilon 仍然不足以使所有的值都为正,你可能需要增大 epsilon 的值或者进一步调查数据以确定为什么会有负数或零值出现。

用户_uBiEPA

arcsin在numpy

  NumPy 中,反正弦函数 arcsin 对应的是 numpy.arcsin。这个函数返回的是输入值的反正弦(以弧度为单位),即计算其正弦值为该输入的角度。

以下是如何使用 numpy.arcsin 的一个例子:

python

复制

import numpy as np# 定义一个数组,包含一些在 [-1, 1] 范围内的值,因为 arcsin 函数的定义域是 [-1, 1]
x = np.array([-1, -0.5, 0, 0.5, 1])# 计算这些值的反正弦
arcsin_values = np.arcsin(x)print(arcsin_values)

请注意,如果输入数组中的值不在 [-1, 1] 的范围内,numpy.arcsin 将会抛出一个 ValueError,因为对于超出这个范围的值,反正弦是没有定义的。如果你想要避免这种情况,可以使用 numpy.clip 函数来限制输入值的范围:

python

复制

# 将 x 中的值限制在 [-1, 1] 范围内
x_clipped = np.clip(x, -1, 1)# 现在,计算这些值的反正弦是安全的
arcsin_values = np.arcsin(x_clipped)

使用 np.clip 可以确保所有的输入值都在 numpy.arcsin 的有效范围内,从而避免运行时错误。

用户_uBiEPA

numpy.format\_float\_scientific

怎么用

ChatGLM

numpy.format_float_scientific 是 NumPy 库中的一个函数,用于将浮点数格式化为科学记数法表示的字符串。以下是该函数的基本用法:

python

复制

import numpy as npdef format_float_scientific(number, precision=None, unique=False, trim='k', sign=False):"""Format a floating-point number in scientific notation.Parameters:- number: floatThe number to format.- precision: int, optionalThe number of significant digits. If None, the precision isdetermined by the format context.- unique: bool, optionalIf True, use a unique representation, removing trailing zeros andthe decimal point. If False (default), use a fixed-point representation.- trim: str, optionalIf 'k' (default), trim all trailing zeros. If '0', do not trim zeros.- sign: bool, optionalIf True, always precede the return value with a sign character.If False (default), only precede with a sign if the number is negative.Returns:- formatted: strThe formatted string."""return np.format_float_scientific(number, precision=precision, unique=unique, trim=trim, sign=sign)# 示例使用
number = 12345.6789
formatted_number = format_float_scientific(number, precision=3)
print(formatted_number)  # 输出: '1.23e+04'

在上面的示例中,format_float_scientific 函数将数字 12345.6789 格式化为科学记数法,并保留三位有效数字,结果是 '1.23e+04'

以下是一些使用 numpy.format_float_scientific 的例子:

python

复制

# 使用默认参数
print(np.format_float_scientific(0.000123456789))  # 输出: '1.23456789e-04'# 指定精度为2
print(np.format_float_scientific(0.000123456789, precision=2))  # 输出: '1.2e-04'# 使用 unique=True 去除尾随零
print(np.format_float_scientific(1.2300, unique=True))  # 输出: '1.23e+00'# 使用 sign=True 总是显示符号
print(np.format_float_scientific(1.23, sign=True))  # 输出: '+1.23e+00'

请根据你的具体需求调整函数的参数。

用 numpy.formatfloatscientific 函数的目的是将一个浮点数格式化为科学记数法的字符串表示。下面是对该函数参数的解释:

  • number: 需要格式化的浮点数。

  • precision: 可选参数,表示格式化后的字符串应该包含的有效数字位数。如果设置为 None,则有效数字的位数将由格式化上下文决定。

  • unique: 可选参数,布尔值。如果设置为 True,则会使用唯一表示,移除尾随的零和不必要的小数点。如果设置为 False(默认值),则使用固定点表示。

  • trim: 可选参数,字符串,用于指定如何修剪尾随的零。默认值是 'k',意味着保留必要的零以保持数值的唯一性。

  • sign: 可选参数,布尔值。如果设置为 True,即使数值为正,也会在科学记数法表示中显示正号。

以下是一个简化的例子,说明如何使用 numpy.formatfloatscientific

python

复制

import numpy as np# 将浮点数格式化为科学记数法的字符串
formatted_number = np.format_float_scientific(12345.6789, precision=2)print(formatted_number)  # 输出可能是 '1.2e+04'

在这个例子中,12345.6789 被格式化为科学记数法,并且只保留了两位有效数字,结果是 '1.2e+04'

请注意,numpy.format_float_scientific 在 NumPy 的某些版本中可能不可用,或者可能存在一些参数差异。如果你使用的是较旧版本的 NumPy,可能需要查看该版本的文档来获取准确的函数签名和使用方法。

用户_uBiEPA

numpy每个元素改为科学计数法

ChatGLM

在NumPy中,如果你想要将一个数组中的每个元素转换为科学计数法的字符串表示,你可以使用numpy.array2string函数,并设置formatter参数为numpy.format_float_scientific。以下是一个例子:

python

复制

import numpy as np# 创建一个NumPy数组
arr = np.array([0.000123, 123456789, 1.2345e-10])# 使用numpy.array2string将数组转换为字符串,每个元素都用科学计数法表示
formatted_arr = np.array2string(arr, formatter={'float': lambda x: format(x, '.2e')})print(formatted_arr)

这段代码会输出类似于以下内容:

复制

['1.23e-04' '1.23e+08' '1.23e-10']

这里,lambda x: format(x, '.2e')是一个lambda函数,它使用了Python内置的format函数来将浮点数格式化为科学计数法,并且保留了两位有效数字。

如果你想要保留更多或更少的有效数字,你可以调整format函数中的.2e中的数字。例如,使用.3e将保留三位有效数字。

如果你想要直接在NumPy数组上操作,而不是转换为字符串,你可以使用numpy.set_printoptions来设置科学计数法的打印选项:

python

复制

import numpy as np# 创建一个NumPy数组
arr = np.array([0.000123, 123456789, 1.2345e-10])# 设置NumPy打印选项,使用科学计数法
np.set_printoptions(scientific=True, precision=2)# 打印数组
print(arr)

这段代码会以科学计数法打印数组,每个元素保留两位有效数字。当你再次打印数组时,这些设置将生效。如果你想恢复默认的打印选项,可以调用np.set_printoptions()而不带任何参数。

用户_uBiEPA

## eq1 grid=20 device='cpu' ## 定义和加载模型 class MLP(nn.Module): def __init__(self): super(MLP,self).__init__() self.net=torch.nn.Sequential( nn.Linear(2,64), nn.Tanh(), nn.Linear(64,64), nn.Tanh(), nn.Linear(64,64), nn.Tanh(), nn.Linear(64,1), ) def forward(self,x): return self.net(x) model1=MLP() model1.load_state_dict((torch.load('0317MLPeq2B0.pth'))) model2 = MultKAN(width=[2,8,8,8,1], grid=grid, k=3, seed=1, device=device,save_act=True) model2.load_state_dict((torch.load('0317simpleKANeq2b0.pth'))) # model21.load_state_dict(torch.load('MLP_eq1_mini_lr_50_05_a001.ptl')) ## 真实解 sol_fun = lambda x: torch.exp(-4*x[:,[1]])*torch.sin(x[:,[0]]-x[:,[1]]) ## 设置x与t rangesx=[0.1,2*torch.pi] rangest=[0.1,1] np_i = 100 ## 画图 fig,axs=plt.subplots(2,2,figsize=[14,10]) ax1,ax2,ax3,ax4=axs[0,0],axs[0,1],axs[1,0],axs[1,1] ## 四格一维曲线 def plot1(tm,ax): # t_mesh1 = torch.linspace(rangest[0],rangest[1],steps=100) # t_mesh1 = torch.tensor(1.6) t_mesh1 = torch.tensor(tm) x_mesh = torch.linspace(rangesx[0],rangesx[1],steps=35) X, T = torch.meshgrid(x_mesh, t_mesh1, indexing="ij") t,x=T.reshape(-1,), X.reshape(-1,) x=x.reshape((len(x),1)) t=t.reshape((len(t),1)) x=x.requires_grad_(True) t=t.requires_grad_(True) # x_i = torch.stack([x,t]).permute(1,0) x_i=torch.cat((x,t),dim=1) # ax.set_xlim([-0.5, 0.5]) # x轴范围 # ax.set_ylim([-0.2, 0.2]) # y轴范围 ax.scatter(x.detach().numpy(),model1(x_i).detach().numpy(),label='MLP-predict',c='b',s=20,marker='<')#,c='y',s=15) ax.scatter(x.detach().numpy(),model2(x_i).detach().numpy(),label='KAN-predict',c='r',s=20,marker='x')#,c='r',s=15) ax.plot(x.detach().numpy(),sol_fun(x_i).detach().numpy(),label='true',c='g',lw=2.5,linestyle=':') # ax.set_yscale('log') ax.legend() ax.set_title('t = %s'%tm) ax.set(xlabel='x',ylabel=r'$\lg(0.001+u)$') ## 输出均方误差 print("t =",tm,"时,MLP均方误差为",nn.MSELoss()(model1(x_i) ,sol_fun(x_i) ).detach().numpy()) print("t =",tm,"时,KAN均方误差为",nn.MSELoss()(model2(x_i) ,sol_fun(x_i) ).detach().numpy()) return plot1(0.1,ax1) plot1(0.3,ax2) plot1(0.5,ax3) plot1(0.9,ax4) 和## eq1 grid=20 device='cpu' ## 定义和加载模型 class MLP(nn.Module): def __init__(self): super(MLP,self).__init__() self.net=torch.nn.Sequential( nn.Linear(2,64), nn.Tanh(), nn.Linear(64,64), nn.Tanh(), nn.Linear(64,64), nn.Tanh(), nn.Linear(64,1), ) def forward(self,x): return self.net(x) model1=MLP() model1.load_state_dict((torch.load('0317MLPeq2B0.pth'))) model2 = MultKAN(width=[2,8,8,8,1], grid=grid, k=3, seed=1, device=device,save_act=True) model2.load_state_dict((torch.load('0317simpleKANeq2b0.pth'))) # model21.load_state_dict(torch.load('MLP_eq1_mini_lr_50_05_a001.ptl')) ## 真实解 sol_fun = lambda x: torch.exp(-4*x[:,[1]])*torch.sin(x[:,[0]]-x[:,[1]]) ## 设置x与t rangesx=[0.1,2*torch.pi] rangest=[0.1,1] np_i = 100 ## 画图 fig,axs=plt.subplots(2,2,figsize=[14,10]) ax1,ax2,ax3,ax4=axs[0,0],axs[0,1],axs[1,0],axs[1,1] ## 四格一维曲线 def plot1(tm,ax): # t_mesh1 = torch.linspace(rangest[0],rangest[1],steps=100) # t_mesh1 = torch.tensor(1.6) t_mesh1 = torch.tensor(tm) x_mesh = torch.linspace(rangesx[0],rangesx[1],steps=35) X, T = torch.meshgrid(x_mesh, t_mesh1, indexing="ij") t,x=T.reshape(-1,), X.reshape(-1,) x=x.reshape((len(x),1)) t=t.reshape((len(t),1)) x=x.requires_grad_(True) t=t.requires_grad_(True) # x_i = torch.stack([x,t]).permute(1,0) x_i=torch.cat((x,t),dim=1) # ax.set_xlim([-0.5, 0.5]) # x轴范围 # ax.set_ylim([-0.2, 0.2]) # y轴范围 ax.scatter(x.detach().numpy(),model1(x_i).detach().numpy(),label='MLP-predict',c='b',s=20,marker='<')#,c='y',s=15) ax.scatter(x.detach().numpy(),model2(x_i).detach().numpy(),label='KAN-predict',c='r',s=20,marker='x')#,c='r',s=15) ax.plot(x.detach().numpy(),sol_fun(x_i).detach().numpy(),label='true',c='g',lw=2.5,linestyle=':') # ax.set_yscale('log') ax.legend() ax.set_title('t = %s'%tm) ax.set(xlabel='x',ylabel=r'$\lg(0.001+u)$') ## 输出均方误差 print("t =",tm,"时,MLP均方误差为",nn.MSELoss()(model1(x_i) ,sol_fun(x_i) ).detach().numpy()) print("t =",tm,"时,KAN均方误差为",nn.MSELoss()(model2(x_i) ,sol_fun(x_i) ).detach().numpy()) return plot1(0.1,ax1) plot1(0.3,ax2) plot1(0.5,ax3) plot1(0.9,ax4) 有何区别

展开

ChatGLM

引用

在你提供的两段代码中,主要的区别在于第二段代码在定义plot1函数时缺少了return语句。在Python中,return语句用于从函数中返回值。如果函数执行到末尾没有遇到return语句,它将默认返回None

以下是两段代码的区别:

第一段代码(## eq1之后的第一段):

  • plot1函数在最后包含了return语句,但是没有指定返回值。这意味着函数执行完毕后将返回None,但是如果有必要,你可以在这个位置返回任何特定的值。

第二段代码(## eq1之后的第二段):

  • plot1函数在执行完毕后没有return语句。函数执行到末尾时,它也会返回None,但是这里没有显式的return

这两段代码在功能上应该是等效的,因为plot1函数的主要目的是在指定的轴(ax)上绘制图形,并打印出均方误差,而不是返回一个值。然而,如果在未来你想要从plot1函数中返回一些数据,那么在第一段代码中的return语句将提供一个插入点。

以下是两段代码的简化比较:

第一段代码:

python

复制

def plot1(tm, ax):# ...(函数实现)...return  # 明确的return语句,虽然没有返回值

第二段代码:

python

复制

def plot1(tm, ax):# ...(函数实现)...# 没有return语句,函数结束时会隐式返回None

在实际使用中,这两段代码应该会产生相同的输出和行为,因为绘图和打印操作都不依赖于return语句。如果你没有其他用途,那么省略return语句是可以的。如果你想保持代码的一致性,可以选择在其中一种风格中保持一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38257.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二项式分布(Binomial Distribution)

二项式分布&#xff08;Binomial Distribution&#xff09; 定义 让我们来看看玩板球这个例子。假设你今天赢了一场比赛&#xff0c;这表示一个成功的事件。你再比了一场&#xff0c;但你输了。如果你今天赢了一场比赛&#xff0c;但这并不表示你明天肯定会赢。我们来分配一个…

【算法工程】大模型开发之windows环境的各种安装

1. 背景 最近由于研究需要&#xff0c;我购置了两块3090显卡&#xff0c;以便在家中进行一些小规模的实验。为此&#xff0c;还更换了主机。当然&#xff0c;新系统上少不了要安装各种开发环境。从开发体验来看&#xff0c;macOS无疑更为流畅&#xff0c;但为了确保所有环境都能…

论文阅读笔记:Denoising Diffusion Probabilistic Models (2)

接论文阅读笔记&#xff1a;Denoising Diffusion Probabilistic Models (1) 3、论文推理过程 扩散模型的流程如下图所示&#xff0c;可以看出 q ( x 0 , 1 , 2 ⋯ , T − 1 , T ) q(x^{0,1,2\cdots ,T-1, T}) q(x0,1,2⋯,T−1,T)为正向加噪音过程&#xff0c; p ( x 0 , 1 , …

vscode查看文件历史git commit记录

方案一&#xff1a;GitLens 在vscode扩展商店下载GitLens 选中要查看的文件&#xff0c;vscode界面右上角点击GitLens的图标&#xff0c;选择Toggle File Blame 界面显示当前打开文件的所有修改历史记录 鼠标放到某条记录上&#xff0c;可以看到记录详情&#xff0c;选中O…

【数据挖掘】Python基础环境安装配置

【数据挖掘】Python基础环境安装配置 一、摘要二、安装Python3.13.2三、安装Jupyter Notebook四、安装Numpy和Pandas以及matplotlib五、安装scikit-learn库和seaborn库 一、摘要 本文主要介绍如何在Windows上安装Python3.13.2&#xff0c;然后基于该Python版本安装Jupyter not…

DeepSeek写打台球手机小游戏

DeepSeek写打台球手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端打台球小游戏H5文件&#xff1a; 要求 可以重新开始游戏 可以暂停游戏 有白球和其他颜色的球&am…

SpringMVC的执行流程剖析和源码跟踪

目录 一、常用组件:1、DispatcherServlet2、HandlerMapping3、Handler4、HandlerAdapter:5、ViewResolver6、View 二、SpringMVC的执行流程:1、流程图 在这里插入图片描述2、文字解析流程图3、ContextLoaderListener 三、源码跟踪1、doService()方法2、doDispatch()方法逻辑分解…

LeetCode hot 100 每日一题(13)——73. 矩阵置零

这是一道难度为中等的题目&#xff0c;让我们来看看题目描述&#xff1a; 给定一个 _m_ x _n_ 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 提示&#xff1a; m matrix.lengthn matrix[0].length1 < m, n …

ubuntu 解挂载时提示 “umount: /home/xx/Applications/yy: target is busy.”

问题如题所示&#xff0c;我挂载一个squanfs文件系统到指定目录&#xff0c;当我使用完后&#xff0c;准备解挂载时&#xff0c;提示umount: /home/xx/Applications/yy: target is busy.&#xff0c;具体的如图所示&#xff0c; 这种提示通常是表明这个路径的内容正在被某些进…

跟着StatQuest学知识06-CNN进行图像分类

目录 一、CNN特点 二、CNN应用于图像分类 &#xff08;一&#xff09;使用过滤器 &#xff08;二&#xff09;通过ReLU激活函数 &#xff08;三&#xff09;应用新的滤波器&#xff08;池化&#xff09; &#xff08;四&#xff09;输入 &#xff08;五&#xff09;输出…

MATLAB 控制系统设计与仿真 - 27

状态空间的标准型 传递函数和状态空间可以相互转换&#xff0c;接下来会举例如何有传递函数转成状态空间标准型。 对角标准型 当 G(s)可以写成&#xff1a; 即&#xff1a; 根据上图可知&#xff1a; 约当标准型 当 G(s)可以写成&#xff1a; 即&#xff1a; 根据上图…

Python网络编程入门

一.Socket 简称套接字&#xff0c;是进程之间通信的一个工具&#xff0c;好比现实生活中的插座&#xff0c;所有的家用电器要想工作都是基于插座进行&#xff0c;进程之间要想进行网络通信需要Socket&#xff0c;Socket好比数据的搬运工~ 2个进程之间通过Socket进行相互通讯&a…

C++ --- 多态

1 多态的概念 多态(polymorphism)的概念&#xff1a;通俗来说&#xff0c;就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态)&#xff0c;这⾥我们重点讲运⾏时多态&#xff0c;编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主要就是我…

MQTT的安装和使用

MQTT的安装和使用 在物联网开发中&#xff0c;mqtt几乎已经成为了广大程序猿必须掌握的技术&#xff0c;这里小编和大家一起学习并记录一下~~ 一、安装 方式1、docker安装 官网地址 https://www.emqx.com/zh/downloads-and-install/broker获取 Docker 镜像 docker pull e…

ROS多机通信功能包——Multibotnet

引言 这是之前看到一位大佬做的集群通信中间件&#xff0c;突发奇想&#xff0c;自己也来做一个&#xff0c;实现更多的功能、更清楚的架构和性能更加高效的ROS多机通信的功能包 链接&#xff1a;https://blog.csdn.net/benchuspx/article/details/128576723 Multibotnet Mu…

pfsense部署四(静态路由的配置)

目录 一 . 介绍 二 . 配置过程 一 . 介绍 pfsense开源防火墙经常在进行组网时&#xff0c;通常会用于连接不同的网络&#xff0c;在这个时候进需要给pfsense配置路由&#xff0c;而这篇文章介绍的是静态路由的配置 二 . 配置过程 拓扑图&#xff1a; 本次实验使用ensp模拟器…

干货!三步搞定 DeepSeek 接入 Siri

Siri高频用户福音&#xff0c;接下来仅需3步教你如何将 DeepSeek 接入 Siri&#xff01;虽然苹果公司并没有给国行产品提供 ai 功能&#xff0c;但是我们可以让自己的 iPhone 更智能一点。虽然有消息称苹果和阿里巴巴将合作为中国iPhone用户开发AI功能&#xff0c;但我们可以先…

自动学习和优化过程,实现更加精准的预测和决策的智慧交通开源了

智慧交通视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。通过高效的实时视…

DeepSeek R1 本地部署指南 (3) - 更换本地部署模型 Windows/macOS 通用

0.准备 完成 Windows 或 macOS 安装&#xff1a; DeepSeek R1 本地部署指南 (1) - Windows 本地部署-CSDN博客 DeepSeek R1 本地部署指南 (2) - macOS 本地部署-CSDN博客 以下内容 Windows 和 macOS 命令执行相同&#xff1a; Windows 管理员启动&#xff1a;命令提示符 CMD ma…

使用 Node.js 读取 Excel 文件并处理合并单元格

使用 Node.js 读取 Excel 文件并处理合并单元格 在现代的数据处理任务中&#xff0c;Excel 文件是一种非常常见的数据存储格式。无论是数据分析、报表生成&#xff0c;还是数据迁移&#xff0c;Excel 文件都扮演着重要的角色。然而&#xff0c;处理 Excel 文件时&#xff0c;尤…