Q3. In previous labs we used m = X.shape[0] but in the compute_gradient_logistic function m,n = X.shape why didnt we use [0] here this time? aren’t we defining the shape to both?

Q4. Here we have defined that dj_dw = np.zeros((n,)) but why its put in parentheses and why is comma put after n? what difference does it make? How its different than let say dj_dw = np.zeros(n)

I know these question may be silly and dumb but I really want to clarify this before moving further. Sorry once again!.

run a, b = (3, 2); print(a)
run a, b, c = (3, 2,); print(a)
run a = (3, 2,); print(a)

run them and try to understand the difference. Try to make more examples for yourself, think about what you should get from those examples, run them, see if their outcomes meet with your expectation. If you want to follow up on this, please share with me what examples you have tried, what you have expected, and how they are not as expected