np.stack ValueError:至少需要一个阵列堆叠



我有一组数据处理步骤。最后是一个np。堆栈,但我一直得到ValueError:需要至少一个数组堆栈。经过调查,似乎我以前的代码并没有真正将数据追加到数组中,因此在堆叠时,它是一个空数组。然而,我不知道为什么追加不工作。

def load_data(self, seq_len = 20, overlap_rate = 0.2, augment = False, verbose = False):
if self.X:
print("You already have the data")
return
df = pd.read_csv(self.data_path)
if verbose:
print("the shape of the data is ", df.shape)
df_arr = df.drop(columns=['id'])
df = None
start_idx = 0
N,D = df_arr.shape#N*4
df_arr = self.preprocess(df_arr)
for i in range(1,N,1):
if verbose and i%10000==0:
print("load %5d of %5d"%(i,N))
if int(df_arr.iloc[i,3])==1:#encounter a new sequence
end_idx = i
seq = df_arr.iloc[start_idx:end_idx,:]
while seq.shape[0]>=seq_len+1:
self.X_raw.append(seq.iloc[:seq_len,:3])
self.X.append(self.noisy(seq.iloc[:seq_len,:3]))
self.labels.append(seq.iloc[1:seq_len+1,:3])
if augment:
self.X_raw.append(self.augment(seq.iloc[:seq_len,:3]))
self.X.append(self.augment(self.noisy(seq.iloc[:seq_len,:3])))
self.labels.append(self.augment(seq.iloc[1:seq_len+1,:3]))
seq = seq[int(seq_len*(1.0 - overlap_rate)):]
start_idx = end_idx
if verbose:
print("load %d sequences of data"%len(self.X))
self.X = np.stack(self.X, 0)
self.X_raw = np.stack(self.X_raw, 0)
self.labels = np.stack(self.labels, 0)

def preprocess(self, data):
self.maxZ = np.max(data[:2])
print(self.maxZ)
data[:2] = data[:2]/self.maxZ
data[:0] = data[:0]/1525
data[:1] = data[:1]/2740
return data
def noisy(self, data):
mean = [0,0,0]
cov = [[.01/1525,0,0],[0,.01/2740,0],[0,0,.01/self.maxZ]]
draw = np.random.multivariate_normal(mean, cov, data.shape[0])
'''tmp = data + draw
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot(data[:,0], data[:,1], data[:,2],'r')
ax.plot(tmp[:,0], tmp[:,1], tmp[:,2],'b')
ax.set_xlabel('x coordinate')
ax.set_ylabel('y coordinate')
ax.set_zlabel('z coordinate')
plt.show()'''
return data + draw
def augment(self, data):
temp = np.zeros(data.shape)
temp[:] = data[:]
temp[:,1] = 1 - data[:,1]
return temp

我认为问题存在于while循环中,其中append发生在数据加载器部分。但我不明白为什么。

Error Trace back is

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-43aa8ee86aef> in <module>
9 
10 dl = DataLoad(directory, filename)
---> 11 dl.load_data(config['seq_len'], config['overlap_rate'], augment = True, verbose = False)
~/RNN_tabletennis/dataloader.py in load_data(self, seq_len, overlap_rate, augment, verbose)
54                 if verbose:
55                         print("load %d sequences of data"%len(self.X))
---> 56                 self.X = np.stack(self.X, 0)
57                 self.X_raw = np.stack(self.X_raw, 0)
58                 self.labels = np.stack(self.labels, 0)
<__array_function__ internals> in stack(*args, **kwargs)
/usr/local/lib/python3.6/site-packages/numpy/core/shape_base.py in stack(arrays, axis, out)
420     arrays = [asanyarray(arr) for arr in arrays]
421     if not arrays:
--> 422         raise ValueError('need at least one array to stack')
423 
424     shapes = {arr.shape for arr in arrays}
ValueError: need at least one array to stack

您的代码中包含self.X = np.stack(self.X, 0).

注意:

  • 这是唯一需要创建self的地方。X,
  • 但在本指令中也指自我。X,所以它应该是

检查"initial creation">的自我。X实际发生。

我的第一个怀疑是self。XNone当你试图执行错误的指令时。

  • 设置verboseTrue。至少您将有一些跟踪打印输出。
  • 允许对你的代码进行一些实验:
    • 配置显示seq_lenoverlap_rate参数。
    • 提供一些有限大小的输入数据。
    • 把你的类的全部内容。

和一些关于if self.X:的提示:

  1. 的自我。X变量是明确定义的。否则你就会receivedNameErrorexception.
  2. 可能是None,这样if self.X:不会提前返回
  3. 如果X被设置为非空Dataframe(包含一些行),您将有ValueError异常。
  4. 如果X是一个空的DataFrame,也会出现同样的异常。
  5. 也许你应该:
    • 假设X是一个DataFrame(可能它是在类中创建的)构造函数)。
    • 检查是否包含一些行。例如,检查df.index.size。在布尔上下文中,在非空DataFrame上,结果是True

最新更新