You better add some print statements to check that your array is properly formed...
You have passed on the dtype names, but there is no indication of the type format (ie text, numbers etc)
Here is an example.
d[:3]
array([('alabaster', '0.7.12', 'py_0', 'python'),
(... snip ... ),
('argh', '0.26.2', 'py36_0', 'python')],
dtype=[('Name', '<U30'), ('Version', '<U15'), ('Build', '<U15'),
('Requires', '<U293')])
Note that Uxx is for unicode (aka, text fields), and you can use
('Float_fld', '<f8') for double/float fields and
('Int_fld', '<i4') for integer fields (or '<i8' if you need large integers)
The help topic uses a dictionary format to form the dtype, which is also permissable, but I prefer explicit and you can use the short forms to cast the text/numeric format
NumPyArrayToTable—Data Access module | Documentation
PS, I have tons of blog posts on numpy