Изменить массив вложенных массивов в массив - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть массив с симпатичными формами

a1.shape
# 1000
a1[0].shape
# (100, 100, 3)

Я хочу изменить форму так, чтобы

a1.shape
# (1000, 100, 100, 3)

Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Составьте список массивов с разными формами (но с одинаковым количеством элементов):

In [72]: alist = [np.ones((2,3),int),np.zeros(6,int),np.arange(6)]
In [73]: alist
Out[73]: 
[array([[1, 1, 1],
        [1, 1, 1]]), array([0, 0, 0, 0, 0, 0]), array([0, 1, 2, 3, 4, 5])]
In [74]: np.array(alist)
Out[74]: 
array([array([[1, 1, 1],
       [1, 1, 1]]), array([0, 0, 0, 0, 0, 0]),
       array([0, 1, 2, 3, 4, 5])], dtype=object)

В результате получается массив типа dtype.

Но если мы изменим все элементы списка в одну и ту же форму, мы получим трехмерный массив:

In [75]: np.array([x.reshape(2,3) for x in alist])
Out[75]: 
array([[[1, 1, 1],
        [1, 1, 1]],

       [[0, 0, 0],
        [0, 0, 0]],

       [[0, 1, 2],
        [3, 4, 5]]])

Теперь давайте попробуем изменить форму элементов после создания массива:

In [76]: arr = np.array(alist)
In [77]: arr.shape
Out[77]: (3,)
In [78]: for i in range(3):
    ...:     arr[i] = arr[i].reshape(2,3)
    ...:     
In [79]: arr
Out[79]: 
array([array([[1, 1, 1],
       [1, 1, 1]]),
       array([[0, 0, 0],
       [0, 0, 0]]),
       array([[0, 1, 2],
       [3, 4, 5]])], dtype=object)
In [80]: np.array(arr)
Out[80]: 
array([array([[1, 1, 1],
       [1, 1, 1]]),
       array([[0, 0, 0],
       [0, 0, 0]]),
       array([[0, 1, 2],
       [3, 4, 5]])], dtype=object)

Вызов array в этом массиве ничего не меняет.

Но stack работает (stack - это просто удобная версия concatenate):

In [82]: np.stack(arr)
Out[82]: 
array([[[1, 1, 1],
        [1, 1, 1]],

       [[0, 0, 0],
        [0, 0, 0]],

       [[0, 1, 2],
        [3, 4, 5]]])

stack принимает список массивов или массив, итерирует по 1-му измерению:

In [83]: np.stack([x for x in arr])
Out[83]: 
array([[[1, 1, 1],
        [1, 1, 1]],

       [[0, 0, 0],
        [0, 0, 0]],

       [[0, 1, 2],
        [3, 4, 5]]])
0 голосов
/ 29 апреля 2018

Просто опубликуйте решение на случай, если кому-то понадобится

x = []
for fname in fl1:
    x.append( np.array(Image.open(fname)))

for i in range(0, len(x)):
  x[i] = imresize(x[i], [100,100], interp='bilinear')   

y = np.array(x)
y.shape
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...