2D-массив - это, по сути, массивы внутри массива, например:
[['a', 'b', 'c'],
['d', 'e', 'f'],
['g', 'h', 'i']]
Я думаю, что ваше решение является наиболее эффективным, но если вы хотите использовать 2D-массивы (обычно 2D-списки в Python), тоВы должны создать двумерный массив введенных измерений, затем выполнить итерацию по каждой строке и элементу в этой строке и умножить каждую пару индексов.
Может быть, что-то вроде этого вложено в циклы:
for i,row in enumerate(array):
for j,item in enumerate(row):
print(i*j,end=' ')
print()