Как умножить четырёхмерный массив нудистов Python на вектор, проиндексированный по второму измерению - PullRequest
0 голосов
/ 12 января 2019

У меня есть четырехмерный массив T (shape = (361,30,100,257)), который мне нужно масштабировать по 30-элементному вектору P. Мне нужно, чтобы результирующий вектор имел ту же форму, что и исходный массив T, и мне нужно, чтобы масштабирование было проиндексировано вторым элементом T. Я попробовал очевидное:

for i in range(len(PressFrac)):
  theta = T[:,i,:,:]*(PressFrac[i])

но полученная тэта теряет второе измерение.

Что мне нужно, так это сохранить первое, третье и четвертое измерения, умноженные на PressFrac [i], и второе измерение (которое представляет собой массив с именем «lev»).

Я пытался использовать np.expand_dims и np.insert ниже цикла, чтобы добавить обратно во второе измерение, но я получаю различные ошибки широковещания. Я пробовал следующие и их комбинации:

theta = np.expand_dims(theta, axis = 1)
np.insert(theta,1,lev,axis=1)
theta = np.stack(theta, lev, axis =1)
theta = np.array(theta)[:,np.newaxis,:,:]

Любые идеи будут великолепны!

Ответы [ 2 ]

0 голосов
/ 12 января 2019

@ ответ макроэкономиста абсолютно правильный и содержит хорошее объяснение правил вещания. Единственное, что я должен добавить, это то, что вы можете сделать синтаксис немного более лаконичным, используя None вместо np.newaxis. Я хотел увидеть трансляцию в действии, поэтому я написал короткий демонстрационный сценарий:

import numpy as np

T = np.arange(4*5*6*7).reshape(4,5,6,7)
w = np.random.randint(1, 10, size=5)

res = T*w[:, None, None]

print('res shape\n%s\n' % (res.shape,))

print('T[:, 2, :, 0]\n%s\n' % T[:, 2, :, 0])
print('T[:, 2, :, 0] * w[2]\n%s\n' % (T[:, 2, :, 0]*w[2]))
print('res[:, 2, :, 0]\n%s\n' % res[:, 2, :, 0])

Выход:

res shape
(4, 5, 6, 7)

T[:, 2, :, 0]
[[ 84  91  98 105 112 119]
 [294 301 308 315 322 329]
 [504 511 518 525 532 539]
 [714 721 728 735 742 749]]

T[:, 2, :, 0] * w[2]
[[ 588  637  686  735  784  833]
 [2058 2107 2156 2205 2254 2303]
 [3528 3577 3626 3675 3724 3773]
 [4998 5047 5096 5145 5194 5243]]

res[:, 2, :, 0]
[[ 588  637  686  735  784  833]
 [2058 2107 2156 2205 2254 2303]
 [3528 3577 3626 3675 3724 3773]
 [4998 5047 5096 5145 5194 5243]]
0 голосов
/ 12 января 2019

Вы можете просто написать

T*P[:, np.newaxis, np.newaxis]

чтобы вернуть версию T со вторым измерением, масштабированным до P. Правила вещания NumPy выстраивают размеры массивов справа, поэтому вам нужно добавить два одиночных измерения в конец P с np.newaxis, как указано выше. Затем мы умножаем T на что-то, имеющее форму (30,1,1), что разрешено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...