Включает в себя: разделить каждую строку на вектор элемента


предположим, что у меня есть массив 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 71

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