2D-список, разделенный другим 2D-списком

#python #numpy

Вопрос:

У меня есть два 2-D списка:

 A = [[10,20,30],
     [5,8,10]]

B = [[1,2,5],
     [5,4,2]]
 

Результат должен быть:

 result = [[10,10,6],
          [1,2,5]]
 

Каков наиболее эффективный способ достижения этой цели?
Я мог думать только о вложенном цикле for, который довольно сложен…

Комментарии:

1. Вложенный цикл не является сложным, это простой способ сделать это. О чем именно вы спрашиваете? Почему это помечено numpy ?

2. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Ответ №1:

Вы упомянули тег numpy , а затем используете его.

Если они еще не являются массивами numpy, сначала преобразуйте их:

 A = np.array(A)
B = np.array(B)
 

Затем разделите их:

 >>> A / B
array([[10., 10.,  6.],
       [ 1.,  2.,  5.]])
>>> 
 

Как упоминал @sj95126, чтобы сделать его целочисленными значениями типа и списком, используйте:

 >>> (A / B).astype(int).tolist()
[[10, 10, 6], [1, 2, 5]]
>>> 
 

Или, как упоминал @wjandrea, вы могли бы сделать их целыми числами уже в самом начале:

 A = np.array(A, dtype='int')
B = np.array(B, dtype='int')
 

Тогда сделай:

 >>> (A // B).tolist()
[[10, 10, 6], [1, 2, 5]]
>>> 
 

Комментарии:

1. Просто чтобы добавить немного, чтобы получить точный результат, указанный в вопросе, вы можете преобразовать результат следующим образом: (A / B).astype(int).tolist() .

2. В качестве альтернативы, с самого начала сохраняйте их как int: a, b = (np.array(x, dtype='int') for x in [A, B]) и используйте разделение этажей: (a // b).tolist() -> > [[10, 10, 6], [1, 2, 5]] .

3. @wjandrea Отредактировал мой ответ!

Ответ №2:

Вы можете использовать np.floor_divide , что эквивалентно // и автоматически преобразует его входные данные в массивы:

 >>> np.floor_divide(A, B)
array([[10, 10,  6],
       [ 1,  2,  5]])
 

Понимание списка было бы неуместным решением, свободным от библиотек:

 >>> [[a // b for a, b in zip(*rows)] for rows in zip(A, B)]
[[10, 10, 6], [1, 2, 5]]