Megan Darcy
Megan Darcy

Reputation: 582

how to pass parameters into python function bug

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

Answers (2)

Stuart
Stuart

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

haccks
haccks

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

Related Questions