The problem is that an np.array has only one type which is automatically assumed to be strings supp.dtype == '|S1' since your input contains only strings of length 1. So numpy will automatically convert your updated inputs to strings of length 1, '0's in your case. Force it to be of generic type object and then it will be able to have both strings and ints or floats or anything else:
supp = np.array([['A', '5', '0'], ['B', '3', '0'], ['C', '4', '0'], ['D', '1', '0'], ['E', '2', '0']])
supp = supp.astype(object)
for row in supp:
row[2] = int(row[1]) / 6
result:
[['A' '5' 0.8333333333333334]
['B' '3' 0.5]
['C' '4' 0.6666666666666666]
['D' '1' 0.16666666666666666]
['E' '2' 0.3333333333333333]]
alternatively you can also use the dtype '|Sn' with larger value of n:
supp = np.array([['A', '5', '0'], ['B', '3', '0'], ['C', '4', '0'], ['D', '1', '0'], ['E', '2', '0']])
supp = supp.astype('|S5')
for row in supp:
row[2] = int(row[1]) / 6
result:
[['A' '5' '0.833']
['B' '3' '0.5']
['C' '4' '0.666']
['D' '1' '0.166']
['E' '2' '0.333']]
and in this case you are still having only strings if that is what you want.
supp[0,0] = 5/6