Могу ли я создать массив NumPy с одним измерением переменной из списка массивов NUMPY? - PullRequest
0 голосов
/ 14 ноября 2018

Вот небольшой пример моей проблемы, у меня есть список массивов, которые выглядят так:

a = np.zeros([4,3])
b = np.ones([5,3])
my_list = [a, b]

my_list
[array([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]]), array([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])]

Массивы в списке могут иметь переменную длину в одном (и только одном) измерении (здесь 4 или 5).

То, что я хотел бы в конечном счете получить, - это пустой массив, имеющий размерность (2, «Переменный размер», 3). Вывод должен выглядеть примерно так:

array([[[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],
        [[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]]])

np.vstack () или np.concatenate () не возвращают мне искомую форму, так как они создают вывод, имеющий форму (9, 3).

1 Ответ

0 голосов
/ 14 ноября 2018

Вы не можете иметь массив numpy с формой: (2, "Variable-size", 3) , но вы можете объединить два массива с формой ("Variable-size" , 3) до (shape1 [0] + shape2 [0], 3) . Как вы написали:

Я ищу, поскольку они производят вывод, который имеет (9, 3) форму

numpy.concatenate()

может быть решением вашей проблемы:

np.concatenate((a,b))

Из:

array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]])

Если вы все еще хотите поддерживать переменное 3-е измерение в numpy, единственный способ сделать это с заполнением , здесь с заполнением нулями :

import numpy as np

a = np.array([
    [50., 50., 50.],
    [50., 50., 50.],
    [50., 50., 50.],
    [50., 50., 50.],
    [0., 0., 0.] # zero padding 
])

b = np.array([
    [80., 80., 80.],
    [80., 80., 80.],
    [80., 80., 80.],
    [80., 80., 80.],
    [80., 80., 80.]
])

new_matrix = [a, b]

print(new_matrix)

Из:

[array([[50., 50., 50.],
       [50., 50., 50.],
       [50., 50., 50.],
       [50., 50., 50.],
       [ 0.,  0.,  0.]]), array([[80., 80., 80.],
       [80., 80., 80.],
       [80., 80., 80.],
       [80., 80., 80.],
       [80., 80., 80.]])]

Этот метод широко используется в решениях для обработки изображений. С помощью этого трюка вы также можете использовать все положительные свойства матричных операций в numpy, но вы можете сохранить свою форму данных относительно гибкой. Как упомянул выше Виллем, numpy работает только с «прямоугольными» данными, а операции с матрицами с переменными измерениями в большинстве случаев будут неоднозначными.

Если вы даже не хотите использовать какое-либо из упомянутых решений, вам нужно выбрать комбинации списков и массивов, то есть массивов с любыми измерениями в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...