Включает в себя: разделить каждую строку на вектор элемента
предположим, что у меня есть массив 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]])