делать вычисления для значений в списках в списках - PullRequest
0 голосов
/ 10 мая 2018

У меня есть два списка списков.

x = [[992,982,...],...,[241,251,...]]
y = [[1184,1178,...],...,[274,294,...]]

, и я хотел бы получить углы между x и y в виде списка списков

angles =[[0.87,0.874,...],...,[0.5,0.52,... ]]

Мой кодследующее:

angles = []
for i in range(1,10):
    for item1 in x[i]:
        for item2 in y[i]:
            angles.append(np.arctan2(item2, item1))

Это дает мне углы в виде списка.

angles = [0.87,0.874,...]

Я хотел бы иметь углы в виде списка списков.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018
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]]]
0 голосов
/ 10 мая 2018

Вероятно, проще всего использовать numpy для массивов.

x_arr = np.array(x)
y_arr = np.array(y)
angles_arr = np.arctan2(x_arr, y_arr)
angles = angles_arr.tolist()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...