In [53]: x = [[992,982],[241,251]]
...: y = [[1184,1178],[274,294]]
...:
Ваш список итераций:
In [56]: angles = []
In [57]: for i in range(2):
...: for item1 in x[i]:
...: for item2 in y[i]:
...: angles.append(math.atan2(item2,item1))
...:
In [58]: angles
Out[58]:
[0.8734055369251891,
0.870903457075653,
0.8783886606617618,
0.8758910778163088,
0.8493883488678455,
0.8841414043445257,
0.8291796919394373,
0.8641341374390786]
разбить эту итерацию списка на один уровень:
In [59]: angles = []
In [60]: for i in range(2):
...: alist = []
...: for item1 in x[i]:
...: for item2 in y[i]:
...: alist.append(math.atan2(item2,item1))
...: angles.append(alist)
...:
In [61]: angles
Out[61]:
[[0.8734055369251891,
0.870903457075653,
0.8783886606617618,
0.8758910778163088],
[0.8493883488678455,
0.8841414043445257,
0.8291796919394373,
0.8641341374390786]]
Я мог бы добавить еще один список уровней, чтобы получить 2 комплекта из 2 комплектов по 2.
Сопряжение элементов массива дает только 4 значения:
In [62]: X = np.array(x); Y = np.array(y)
In [63]: np.arctan2(Y,X)
Out[63]:
array([[0.87340554, 0.87589108],
[0.84938835, 0.86413414]])
Я мог бы использовать трансляцию, чтобы получить 8 значений
In [65]: np.arctan2(Y[:,None,:],X[:,:,None])
Out[65]:
array([[[0.87340554, 0.87090346],
[0.87838866, 0.87589108]],
[[0.84938835, 0.8841414 ],
[0.82917969, 0.86413414]]])
Обратите внимание, что это трехмерный массив (2,2,2).
наоборот, я мог бы получить только 4 значения из циклов:
In [66]: angles = []
In [67]: for i in range(2):
...: alist = []
...: for item1, item2 in zip(x[i],y[i]):
...: alist.append(math.atan2(item2,item1))
...: angles.append(alist)
...:
...:
In [68]: angles
Out[68]:
[[0.8734055369251891, 0.8758910778163088],
[0.8493883488678455, 0.8641341374390786]]
При работе со скалярами math.atan2
быстрее np.arctan2
.
Или в форме понимания списка:
In [72]: [[[math.atan2(item2,item1)] for item1, item2 in zip(x[i],y[i])] for i in range(2)]
Out[72]:
[[[0.8734055369251891], [0.8758910778163088]],
[[0.8493883488678455], [0.8641341374390786]]]