如何将二维python numpy数组乘以第二维索引的向量

时间:2019-01-12 15:19:59

标签: python arrays numpy

我有一个四维数组T(shape =(361,30,100,257)),需要按30个元素的矢量P进行缩放。我需要得到的矢量具有与原始T数组相同的形状,并且我需要缩放比例由T的第二个元素索引。我尝试了显而易见的方法:

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

,但是得到的theta失去了第二维。

我需要的是将第一,第三和第四个维度乘以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 :(得分:3)

你可以写

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

以获取T的版本,第二维以P缩放。 NumPy的广播规则在右侧排列了数组的维度,因此您需要在P的末尾添加两个单例维度,其中np.newaxis类似于上面。然后,我们将T与形状为(30,1,1)的东西相乘,这是允许的。

答案 1 :(得分:0)

@macroeconomist的回答是完全正确的,并且对要启动的广播规则有很好的解释。我唯一要补充的是,您可以使用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]]