我有一个四维数组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,:,:]
任何想法都很棒!
答案 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]]