使用python中的新数组大小和值覆盖数组大小

时间:2017-02-01 23:34:38

标签: python arrays numpy

我有以下输出的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

我不太确定解决方案是什么,甚至在网上寻找什么(我试图寻找覆盖/重载数组大小)。除了找到这个问题的答案之外,这个问题的正确术语是什么?

2 个答案:

答案 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

索引由[0]

关闭