Home > Enterprise >  How to append a numpy Array into another one
How to append a numpy Array into another one

Time:10-10

This is my code...

image_paths = dt_labels['image']
train_X = np.ndarray([])
for image_path in image_paths:
    path = './Dataset/'   image_path
    img = cv2.imread(path, 0)
    vectorized_img = img.reshape(img.shape[0] * img.shape[1], 1)
    train_X = np.append(train_X, vectorized_img, axis=1)

As you can see, i have an ndarray in the var named train_X, and... i read an image and reshape it into a vector of one dimention, and when i try to append into the ndarray train_X, and i got this error:

zero-dimensional arrays cannot be concatenated

I just want to concatenate the multiple arrays "vectorized_img" into the train_X ndarray in horizontal

CodePudding user response:

In [103]: train_X = np.ndarray([])
     ...: print(train_X.shape)
     ...: for i in range(3):
     ...:     vectorized_img = np.ones((4, 1))
     ...:     train_X = np.append(train_X, vectorized_img, axis=1)
     ...: 
()
Traceback (most recent call last):
  File "<ipython-input-103-26d2205beb4e>", line 5, in <module>
    train_X = np.append(train_X, vectorized_img, axis=1)
  File "<__array_function__ internals>", line 5, in append
  File "/usr/local/lib/python3.8/dist-packages/numpy/lib/function_base.py", line 4745, in append
    return concatenate((arr, values), axis=axis)
  File "<__array_function__ internals>", line 5, in concatenate
ValueError: zero-dimensional arrays cannot be concatenated

np.append just calls np.concatenate. One argument has shape (), the other (4,1). The error is that it can't join those.

np.ndarray([]) is NOT a clone of [], and np.append is not a clone of list append. concatenate says that the number of dimensions must match, and the size of the dimensions must also match (except for the concatenate one).

To join 'columns' we need to start with a 'column'

In [111]: train_X = np.ones((4,0))
     ...: for i in range(3):
     ...:     vectorized_img = np.ones((4, 1))
     ...:     train_X = np.append(train_X, vectorized_img, axis=1)
     ...: train_X.shape
Out[111]: (4, 3)

Or we could start with (0,1) and join on axis=0.

But it's faster, and less prone to errors it we stick with list append:

In [114]: alist = []
     ...: for i in range(3):
     ...:     vectorized_img = np.ones((4, 1))
     ...:     alist.append(vectorized_img)
     ...: np.concatenate(alist, axis=1)
Out[114]: 
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])
  • Related