#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]]