Reputation: 582
I have this piece of code:
points = np.array([[207.0,489.0], [500.0,58.0], [84.0,17.0],[197.0,262.0]])
#read data from the csv file
x = df["XC"]
y = df["YC"]
# make the x,y a point type
pointP = np.array([x,y])
#print(pointP)
rW,rV,rU = calcRatios(points,pointP,ratioU,ratioV,ratioW)
and this is the calcRatios function
def calcRatios(points,centreP,ratioU,ratioV,ratioW):
v0 = points[1] - points[0]
v1 = points[2] - points[0]
v2 = centreP - points[0]
#dot product of the vects
d00 = np.dot(v0, v0)
d01 = np.dot(v0, v1)
d11 = np.dot(v1, v1)
d20 = np.dot(v2, v0)
d21 = np.dot(v2, v1)
#calc denom
denom = d00 * d11 - d01 * d01
#barycentric ratios of v,w,u
ratioV = (d11 * d20 - d01 * d21) / denom
ratioW = (d00 * d21 - d01 * d20) / denom
ratioU = 1.0 - ratioV - ratioW
return ratioV,ratioW,ratioU
The data from the dataframe is stored like this:
Index XC YC R G B
1 0 0 227 227 227
2 1 0 237 237 237
3 2 0 0 0 0
4 3 0 232 232 232
5 4 0 233 233 233
... ... ... ... ... ... ...
However right now there seems to be an issue with the centreP point that I am passing into the function and I am not sure why.
The error I get says : ValueError: operands could not be broadcast together with shapes (2,28686) (2,)
for this line v2 = centreP - points[0]
Could someone tell me why this is happening and how it should be fixed?
Thank you!
Upvotes: 1
Views: 115
Reputation: 9858
Your centreP
is an array of two long arrays: [[0, 1, 2...], [0,0,0...]]
, while points[0]
is a single array of length 2, [207.0,489.0]
. numpy's broadcasting rules can't handle subtraction of these two shapes. However if you transpose centreP
to [[0,0], [1,0], [2,0]...]
it will handle this by subtracting points[0]
from each row:
v2 = centreP.T - points[0]
Better still, pass df[[XC, YC]]
instead of pointP
- it will be coerced to a numpy array in the right shape.
rW,rV,rU = calcRatios(points, df[["XC","YC"]]) # no need to transpose
Upvotes: 2
Reputation: 106002
np.array([x,y])
will return an array of arrays, not what you are expecting. If you want to have an array of points out of x
and y
then this will do the job
pointP = np.array([[a, b] for a, b in zip(x, y)])
Upvotes: 0