Включает в себя: разделить каждую строку на вектор элемента
предположим, что у меня есть массив numpy:
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
и у меня есть соответствующий "вектор:"
vector = np.array([1,2,3])
как я могу работать на data вдоль каждой строки, либо вычесть или разделить таким образом:
sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]
long story short: Как выполнить операцию над каждой строкой 2D-массива с 1D-массивом скаляров, которые соответствуют каждой строке?
3 ответа:
здесь вы идете. Вам просто нужно использовать
None(илиnp.newaxis) в сочетании с трансляцией:In [6]: data - vector[:,None] Out[6]: array([[0, 0, 0], [0, 0, 0], [0, 0, 0]]) In [7]: data / vector[:,None] Out[7]: array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
как уже упоминалось, нарезка с
Noneилиnp.newaxes- Это отличный способ сделать это. Другой альтернативой является использование транспонирования и трансляции, как в(data.T - vector).Tи
(data.T / vector).Tдля многомерных массивов вы можете использовать
swapaxesметод массивов NumPy или NumPy
решение JoshAdel использует np.новая ось для добавления измерения. Альтернативой является использование изменить форму () для выравнивания размеров при подготовке к трансляции.
data = np.array([[1,1,1],[2,2,2],[3,3,3]]) vector = np.array([1,2,3]) data # array([[1, 1, 1], # [2, 2, 2], # [3, 3, 3]]) vector # array([1, 2, 3]) data.shape # (3, 3) vector.shape # (3,) data / vector.reshape((3,1)) # array([[1, 1, 1], # [1, 1, 1], # [1, 1, 1]])выполнение reshape() позволяет измерениям выстраиваться в линию для трансляции:
data: 3 x 3 vector: 3 vector reshaped: 3 x 1отметим, что
data/vectorэто нормально, но это не дает вам ответ, который вы хотите. Он делит каждый колонки наarray(вместо каждого row) соответственно элементvector. Это то, что вы получите, если вы явно изменилиvectorна1x3вместо3x1.data / vector # array([[1, 0, 0], # [2, 1, 0], # [3, 1, 1]]) data / vector.reshape((1,3)) # array([[1, 0, 0], # [2, 1, 0], # [3, 1, 1]])