Добавить в список всегда лучше, чем np.append
.Это быстрее и проще в использовании.
Но давайте посмотрим на ваш код более подробно:
In [128]: df = pd.DataFrame(np.random.choice([0.0, 0.05], size=(1000,1000)))
In [129]: l = np.array([])
In [130]: rand_cols = np.random.permutation(df.columns)[0:5]
In [131]: rand_cols
Out[131]: array([190, 106, 618, 557, 514])
In [132]: df2 = df[rand_cols].copy()
In [133]: df2.shape
Out[133]: (1000, 5)
In [134]: l1 = np.append(l, df2, axis=0)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-134-64d82acc3963> in <module>
----> 1 l1 = np.append(l, df2, axis=0)
/usr/local/lib/python3.6/dist-packages/numpy/lib/function_base.py in append(arr, values, axis)
4692 values = ravel(values)
4693 axis = arr.ndim-1
-> 4694 return concatenate((arr, values), axis=axis)
4695
4696
ValueError: all the input arrays must have same number of dimensions
Поскольку вы указали ось, все, что np.append
делает, это:
np.concatenate([l, df2], axis=0)
l
имеет (0,) форму, df2
имеет (1000,5).1d и 2d, отсюда и жалоба на размеры.
Начиная с массива 2d l
работает:
In [144]: l = np.zeros((0,5))
In [145]: np.concatenate([l, df2], axis=0).shape
Out[145]: (1000, 5)
In [146]: np.concatenate([df2, df2], axis=0).shape
Out[146]: (2000, 5)
Я думаю, np.append
следует считать устаревшим.Мы видим слишком много ошибок SO.Как показывает ваш случай, сложно создать правильный начальный массив.np.array([])
работает только при построении 1d массива.Плюс повторяющиеся объединения происходят медленно, каждый раз создавая совершенно новый массив.