0

I'm implementing a Perceptron 3D, and in this case I have n points that are separable, in the case, blue dots and red dots, and I need to plots them from my dictionary, I tried to do this:

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()

But without success, I get the following error message:

TypeError: Cannot cast array data from dtype('float64') to dtype('S32') according to the rule 'safe'

P.S.: I'm using:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

I'd like to know what I'm doing wrong, and how can I plot them correctly.

1 Answers1

1

Your coordinates are strings, even after splitting you have "0.46", instead of 0.46. You need to cast them to a float, e.g. float("0.46") == 0.46.

So in this case, the conversion can happen inside list generation:

x_coords = [float(point.split(",")[0]) for point in data.keys() if data[point] == color]
ImportanceOfBeingErnest
  • 321,279
  • 53
  • 665
  • 712