我有以下输出的python代码:
# Somecode block before
#####################
print np.shape(data2['sac']['startx'][0][0])
print np.shape(startx_buff)
# New Completed Assignment
data2['sac']['startx'][0][0][0] = startx_buff
#**shape of data2['sac']['startx'][0][0] = (2, 119, 20)**
#**shape of startx_buff = (2,120,20)**
#***Error: data2['sac']['startx'][0][0][0] = startx_buff
ValueError:无法将形状(2,120,20)的输入数组广播为形状(119,20)***
我基本上想要覆盖data2['sac']['startx'][0][0]
条目以获得(2,120,20)
维度(以及startx_buff
的值)。原因是:经过后处理后,我注意到一个条目值丢失了。在MATLAB中,这没有问题,因为它更灵活,我可以通过为变量赋值新值和数组/单元格形状来重新定义变量。但是我在python中尝试解决方法的其他方法并非“工作”:
del data2['sac']['startx'][0][0]
data2['sac']['startx'][0][0] = np.empty((2,120,20))
#Error: won't let me delete all the values in the array
我不太确定解决方案是什么,甚至在网上寻找什么(我试图寻找覆盖/重载数组大小)。除了找到这个问题的答案之外,这个问题的正确术语是什么?
答案 0 :(得分:1)
使用更简单的名称(我们不需要所有字典索引),您要做的是:
rowspan={{ ... }}
MATLAB确实允许某种自动维度增长,但不知何故我怀疑它是否灵活。这将是危险的。当我在MATLAB工作时,从不依赖于这种行为。无论如何,In [212]: X = np.zeros((2,119,20),int)
In [214]: y = np.ones((2,120,20),int)
In [215]: X[0,:,:] = y
...
ValueError: could not broadcast input array from shape (2,120,20) into shape (119,20)
期望完全匹配 - 在广播规则范围内(这增加了MATLAB没有(或至少没有)的强大功能)。
重点是numpy
(我添加了:为了清晰度读者)是一个(119,20)插槽。 (2,120,20)区块无法适应那里。
这确实有效(减少LHS以适应):
X[0,:,:]
我们也可以使用连接增长X[0,:,:] = y[0, :119, :]
X
In [219]: X1 = np.concatenate((X, np.zeros((2,1,20),int)), axis=1)
In [220]: X1.shape
Out[220]: (2, 120, 20)
In [221]: X1[0,:,:] = y[0,:,:]
也有效,但resize
可以更好地控制填充值:
concatenate
In [222]: np.resize(X, (2,120,20)).shape
Out[222]: (2, 120, 20)
是具有该形状的完整数组。只有在未指定值的意义上它才是空的。 np.empty((2,120,20))
没有等效的列表numpy
(还有一个x[1:3]=[]
函数。)
np.delete
表达有点不清楚。在Python中,看起来像几个级别的字典访问,然后是几个级别的列表索引。
请记住,numpy数组大致相当于MATLAB矩阵,python列表更像MATLAB单元格。像单元格这样的列表可以容纳任何东西,包括数组。
data2['sac']['startx'][0][0]
答案 1 :(得分:0)
解决方案和拼写错误(Willem标记):
data2['sac']['startx'][0][0] = startx_buff