Предположим у меня есть массив NumPy:
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
и у меня есть соответствующий фильм "Вектор"и
vector = np.array([1,2,3])
Как я могу оперировать данными по каждой строке либо вычесть или разделить таким образом:
sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]
Короче говоря: как я могу выполнить операцию для каждой строки в 2D массив с массивом 1Д скаляров, которые соответствуют каждой строке?
Здесь вы идете. Вам просто нужно использовать значение none
(или НП.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
или с `НП.newaxes-это отличный способ сделать это.
Другой альтернативой является использование переложение и вещание, как в
(data.T - vector).T
и
(data.T / vector).T
Для многомерных массивов можно использовать метод swapaxes
массивов numpy или функции библиотеки numpy rollaxis
.
Есть очень много способов сделать это.
Для более детального разъяснения вещания, см. http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
JoshAdel'решение S использует НП.newaxis, чтобы добавить измерение. В качестве альтернативы можно использовать изменить (), чтобы выровнять размеры в подготовке к вещанию.
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]])
Выполнение перекроить() позволяет размеры выстраиваться на вещание:
data: 3 x 3
vector: 3
vector reshaped: 3 x 1
Обратите внимание, что данные/вектор
- это хорошо, но это не'т получить вам ответ, что вы хотите. Он делит каждый колонки в массив
(вместо каждой строке**) по каждому соответствующему элементу ООО "Вектор". Это's то, что вы получите, если вы явно изменили "вектор", чтобы быть 1х3
вместо 3х1
.
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]])
Подходящие для Python способ сделать это ...
np.divide(data,vector)
Это заботится о перепрофилировании, а также результаты в формат с плавающей запятой. В других ответов результаты в округлые целочисленном формате.
#Примечание: количество столбцов в обоих данных и вектора должны совпадать
Добавление к ответу stackoverflowuser2010, в общем случае вы можете просто использовать
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
vector = np.array([1,2,3])
data / vector.reshape(-1,1)
Это позволит превратить ваш вектор в матрице столбец/вектор`. Позволяет делать операции поэлементно, как вы хотите. По крайней мере для меня, это самый интуитивно понятный способ сделать это и так (в большинстве случаев) и NumPy будет просто использовать представление о той же внутренней памяти для перестройки его'В С эффективно.