在 python 中绘制可分离 3D 点的最简单方法
Simplest way to plot separable 3D points in python
我正在实现 Perceptron 3D,在这种情况下,我有 n 个可分离的点,在这种情况下,蓝点和红点,我需要从我的字典中绘制它们,我试图这样做:
training_data = {
'0.46,0.98,-0.43' : 'Blue',
'0.66,0.24,0.0' : 'Blue',
'0.35,0.01,-0.11' : 'Blue',
'-0.11,0.1,0.35' : 'Red',
'-0.43,-0.65,0.46' : 'Red',
'0.57,-0.97,0.8' : 'Red'
}
def get_points_of_color(data, color):
x_coords = [point.split(",")[0] for point in data.keys() if
data[point] == color]
y_coords = [point.split(",")[1] for point in data.keys() if
data[point] == color]
z_coords = [point.split(",")[2] for point in data.keys() if
data[point] == color]
return x_coords, y_coords, z_coords
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# Plot blue points
x_coords, y_coords, z_coords = get_points_of_color(training_data, 'Blue')
ax.scatter(x_coords, y_coords, z_coords, 'bo')
# Plot red points
x_coords, y_coords, z_coords = get_points_of_color(training_data, 'Red')
ax.scatter(x_coords, y_coords, z_coords, 'ro')
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
ax.set_zlim(-1, 1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
但没有成功,我收到以下错误消息:
TypeError: Cannot cast array data from dtype('float64') to dtype('S32') according to the rule 'safe'
P.S.: 我正在使用:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
我想知道我做错了什么,我怎样才能正确绘制它们。
你的坐标是字符串,即使在拆分后你有 "0.46"
,而不是 0.46
。您需要将它们转换为浮点数,例如float("0.46") == 0.46
.
所以在这种情况下,转换可以发生在列表生成中:
x_coords = [float(point.split(",")[0]) for point in data.keys() if data[point] == color]
我正在实现 Perceptron 3D,在这种情况下,我有 n 个可分离的点,在这种情况下,蓝点和红点,我需要从我的字典中绘制它们,我试图这样做:
training_data = {
'0.46,0.98,-0.43' : 'Blue',
'0.66,0.24,0.0' : 'Blue',
'0.35,0.01,-0.11' : 'Blue',
'-0.11,0.1,0.35' : 'Red',
'-0.43,-0.65,0.46' : 'Red',
'0.57,-0.97,0.8' : 'Red'
}
def get_points_of_color(data, color):
x_coords = [point.split(",")[0] for point in data.keys() if
data[point] == color]
y_coords = [point.split(",")[1] for point in data.keys() if
data[point] == color]
z_coords = [point.split(",")[2] for point in data.keys() if
data[point] == color]
return x_coords, y_coords, z_coords
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# Plot blue points
x_coords, y_coords, z_coords = get_points_of_color(training_data, 'Blue')
ax.scatter(x_coords, y_coords, z_coords, 'bo')
# Plot red points
x_coords, y_coords, z_coords = get_points_of_color(training_data, 'Red')
ax.scatter(x_coords, y_coords, z_coords, 'ro')
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
ax.set_zlim(-1, 1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()
但没有成功,我收到以下错误消息:
TypeError: Cannot cast array data from dtype('float64') to dtype('S32') according to the rule 'safe'
P.S.: 我正在使用:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
我想知道我做错了什么,我怎样才能正确绘制它们。
你的坐标是字符串,即使在拆分后你有 "0.46"
,而不是 0.46
。您需要将它们转换为浮点数,例如float("0.46") == 0.46
.
所以在这种情况下,转换可以发生在列表生成中:
x_coords = [float(point.split(",")[0]) for point in data.keys() if data[point] == color]