收数据花式画图plt实战

news2025/3/24 14:36:26

目录

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 np

def format_float_scientific(number, precision=None, unique=False, trim='k', sign=False):
    """
    Format a floating-point number in scientific notation.

    Parameters:
    - number: float
        The number to format.
    - precision: int, optional
        The number of significant digits. If None, the precision is
        determined by the format context.
    - unique: bool, optional
        If True, use a unique representation, removing trailing zeros and
        the decimal point. If False (default), use a fixed-point representation.
    - trim: str, optional
        If 'k' (default), trim all trailing zeros. If '0', do not trim zeros.
    - sign: bool, optional
        If 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: str
        The 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.coloradmin.cn/o/2320205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统架构书单推荐(一)领域驱动设计与面向对象

本文主要是个人在学习过程中所涉猎的一些经典书籍&#xff0c;有些已经阅读完&#xff0c;有些还在阅读中。于我而言&#xff0c;希望追求软件系统设计相关的原则、方法、思想、本质的东西&#xff0c;并希望通过不断的学习、实践和积累&#xff0c;提升自身的知识和认知。希望…

Centos6配置yum源

Centos6配置yum源 为Centos6配置CentOS Vault源—防止yum源过期为Centos6配置epel源为Centos6配置ELRepo源---已ELRepo被官方清空Centos6安装dockerdocker配置国内镜像加速 为Centos6配置CentOS Vault源—防止yum源过期 参考&#xff1a;https://mirrors.ustc.edu.cn/help/cen…

CVPR 2025 | 文本和图像引导的高保真3D数字人高效生成GaussianIP

小小宣传一下CVPR 2025的工作GaussianIP。 arXiv&#xff1a;https://arxiv.org/abs/2503.11143 Github&#xff1a;https://github.com/silence-tang/GaussianIP 欢迎star, issue~ 摘要 文本引导的3D人体生成随着高效3D表示及2D升维方法&#xff08;如SDS&#xff09;的发展…

Cursor从小白到专家

文章目录 1&#xff1a;简单开发一个贪吃蛇游戏规则设置提示词 cursor开发小工具开发整体步骤创建.cursorrules输入提示词composer模式chat模式 执行cursor accept all发布到线上进行分享 cursor开发一个浏览器插件创建.cursorrulescursor rules范例集工具 输入提示词执行curso…

使用C++在Qt框架下调用DeepSeek的API接口实现自己的简易桌面小助手

项目背景 随着DeepSeek的爆火&#xff0c;最近的DeepSeek也进行了新一轮技术的更新&#xff0c;为了拥抱新时代&#xff0c;我们也要不断学习新的知识&#xff0c;难的底层原理我们接触不到&#xff0c;简单的调用还能难住我们&#xff1f; 因为在网络上搜集到的资源都是用Py…

【信息系统项目管理师】【高分范文】【历年真题】​论信息系统项目的风险管理

【手机端浏览】☞【信息系统项目管理师】【高分范文】【历年真题】​论信息系统项目的风险管理 2023年上半年考题 【题目】 论信息系统项目的风险管理 项目风险管理旨在识别和管理未被项目计划及其他过程所管理的风险&#xff0c;如果不妥善管理&#xff0c;这些风险可能导致项…

Debain-12.9使用vllm部署内嵌模型/embedding

Debain-12.9使用vllm部署内嵌模型/embedding 基础环境准备下载模型部署模型注册dify模型 基础环境准备 基础环境安装 下载模型 modelscope download --model BAAI/bge-m3 --local_dir BAAI/bge-m3部署模型 vllm serve ~/ollama/BAAI/bge-m3 --served-model-name bge-m3 --t…

Milvus学习整理

Milvus学习整理 一、度量类型(metric_type) 二、向量字段和适用场景介绍 三、索引字段介绍 &#xff08;一&#xff09;、概述总结 &#xff08;二&#xff09;、详细说明 四、简单代码示例 &#xff08;一&#xff09;、建立集合和索引示例 &#xff08;二&#xff09…

MySQL事务全解析:从概念到实战

在数据库操作中&#xff0c;事务是一个至关重要的概念&#xff0c;它确保了数据的完整性和一致性。今天&#xff0c;就让我们深入探讨MySQL事务的方方面面&#xff0c;从基础概念到实际应用&#xff0c;全面掌握这一技能。 一、为什么需要事务 假设张三要给李四转账100元&…

手机怎么换网络IP有什么用?操作指南与场景应用‌

在数字化时代&#xff0c;手机已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是工作、学习还是娱乐&#xff0c;手机都扮演着至关重要的角色。而在手机的使用过程中&#xff0c;网络IP地址作为设备在互联网上的唯一标识符&#xff0c;其重要性和作用不容忽视。本文将…

科技赋能安全:慧通测控的安全带全静态性能测试

汽车的广泛普及给人们的出行带来了极大便利&#xff0c;但交通事故频发也成为严重的社会问题。据世界卫生组织统计&#xff0c;全球每年约有 135 万人死于道路交通事故&#xff0c;而安全带在减少事故伤亡方面起着不可替代的作用。正确使用安全带可使前排驾乘人员的死亡风险降低…

记录修复一个推拉门滑轮

推拉门有个滑轮的固定螺丝不知什么时候掉了&#xff0c;也找不到&#xff0c;这就导致推拉门卡在轨道上。 这种滑轮在夕夕上很便宜&#xff0c;比哈罗单车还划算&#xff0c;但是现在缺的只是螺丝&#xff0c;如果买就会多出来一个轮… 这种螺丝比较长&#xff0c;大概是m4的…

压缩壳学习

壳是什么 壳就是软件的一个保护套&#xff0c;防止软件被进行反编译或被轻易地修改。 其作用就是为了保护软件。 常见的大类壳有压缩壳、加密壳、VM 壳的分类。 压缩壳顾名思义就是用来减小软件的文件大小的&#xff1b;加密壳&#xff0c;通过加密软件来保护软件&#xff…

深入理解 Linux ALSA 音频架构:从入门到驱动开发

文章目录 一、什么是 ALSA?二、ALSA 系统架构全景图核心组件详解:三、用户空间开发实战1. PCM 音频流操作流程2. 高级配置(asound.conf)四、内核驱动开发指南1. 驱动初始化模板2. DMA 缓冲区管理五、高级主题1. 插件系统原理2. 调试技巧3. 实时音频优化六、现代 ALSA 发展七…

CCF-CSP认证 202206-2寻宝!大冒险!

题目描述 思路 有一张绿化图和藏宝图&#xff0c;其中绿化图很大&#xff08;二维数组在限定的空间内无法存储&#xff09;&#xff0c;而藏宝图是绿化图中的一部分&#xff0c;对于绿化图和藏宝图&#xff0c;左下角的坐标为(0, 0)&#xff0c;右上角的坐标是(L, L)、(S, S)&…

仿函数 VS 函数指针实现回调

前提&#xff1a; 本博客对比 函数指针实现回调 和 仿函数 &#xff0c;突出仿函数的优势。 目的&#xff1a; 一个类要能够灵活的调用两个函数&#xff0c;essfc 和 greaterfc&#xff0c;分别用于比较两个整数的大小&#xff1a; ①&#xff1a;lessfc&#xff1a;判断 x …

MQTT的安装和使用

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

PRODIGY: “不折腾人”的蛋白-蛋白/蛋白-小分子结合能计算工具

PRODIGY&#xff08;全称为 PROtein binDIng enerGY prediction&#xff09;是一种蛋白质结合能预测工具&#xff0c;可利用蛋白质-蛋白质复合物的三维结构来预测其结合亲和力。PRODIGY 利用一种高效的基于接触的方法&#xff0c;在估计结合自由能和解离常数的同时&#xff0c;…

C++之 【模板初阶(函数模板与类模板)】

目录 1.泛型编程 2.模板 3函数模板 3.1函数模板的概念 3.2函数模板的格式 3.3函数模板的原理 3.4函数模板的实例化 3.4.1隐式实例化&#xff1a;让编译器根据实参推演模板参数的实际类型 3.4.2显示实例化&#xff1a;在函数名后的<>中指定模板参数的实际类型 3.…

在线教育网站项目第四步:deepseek骗我, WSL2不能创建两个独立的Ubuntu,但我们能实现实例互访及外部访问

一、说明 上一章折腾了半天&#xff0c;搞出不少问题&#xff0c;今天我们在deepseek的帮助下&#xff0c;完成多个独立ubuntu24.04实例的安装&#xff0c;并完成固定ip&#xff0c;实践证明&#xff0c;deepseek不靠谱&#xff0c;浪费我2个小时时间&#xff0c;我们将在下面实…