объединить массивы по оси = 3, в то время как первое измерение отличается - PullRequest
0 голосов
/ 30 апреля 2018

l имеют около 20 различных форм данных. Я хотел бы объединить их на axis=3

data_1=dim(1000,150,10)
data_2=dim(1000,150,10)
data_3=dim(1000,150,10)
data_4=dim(1000,150,10)

и

features_1=dim(1000,150,10)
features_2=dim(1000,150,10)
features_3=dim(1000,150,10)
features_4=dim(1000,150,10)

l объединяет их в data и features переменную

отсюда

data.shape= (4,1000,150,10)

и

features.shape=(4,1000,150,10)

Что я хочу сделать?

объединение данных и элементов по оси = 3 в переменной с именем data_concat

так что data_concat.shape=(4,1000,150,20)

для этого я сделал следующее:

data_concat = np.concatenate((data,features),axis=3)

Однако, когда это не работает, когда первое измерение не совпадает. Например:

data_1=dim(1000,150,10)
data_2=dim(1200,150,10)
data_3=dim(800,150,10)
data_4=dim(400,150,10)

и

features_1=dim(1000,150,10)
features_2=dim(1200,150,10)
features_3=dim(800,150,10)
features_4=dim(400,150,10)

1039 * поэтому *

data.shape= (4,)

и

features.shape=(4,)

Делать:

data_concat = np.concatenate((data,features),axis=3)

не работает, потому что сцепление не видит ось = 3 с

data.shape = (4,)

и

features.shape=(4,)

Спасибо

Ответы [ 2 ]

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

Это может быть сделано либо путем понимания списка, либо, если результат должен быть массивом с np.frompyfunc:

# create example
>>> data = np.array([np.arange(n*12).reshape(n, 2, 6) for n in range(2, 5)])
>>> features = np.array([np.ones((n, 2, 6), int) for n in range(2, 5)])
>>> data.shape, features.shape
((3,), (3,))
>>> 
# list comprehension
>>> [np.concatenate(xy, 2) for xy in zip(data, features)]
[array([[[ 0,  1,  2,  3,  4,  5,  1,  1,  1,  1,  1,  1],
        [ 6,  7,  8,  9, 10, 11,  1,  1,  1,  1,  1,  1]],

       [[12, 13, 14, 15, 16, 17,  1,  1,  1,  1,  1,  1],
        [18, 19, 20, 21, 22, 23,  1,  1,  1,  1,  1,  1]]]), array([[[ 0,  1,  2,  3,  4,  5,  1,  1,  1,  1,  1,  1],
        [ 6,  7,  8,  9, 10, 11,  1,  1,  1,  1,  1,  1]],

       [[12, 13, 14, 15, 16, 17,  1,  1,  1,  1,  1,  1],
        [18, 19, 20, 21, 22, 23,  1,  1,  1,  1,  1,  1]],

       [[24, 25, 26, 27, 28, 29,  1,  1,  1,  1,  1,  1],
        [30, 31, 32, 33, 34, 35,  1,  1,  1,  1,  1,  1]]]), array([[[ 0,  1,  2,  3,  4,  5,  1,  1,  1,  1,  1,  1],
        [ 6,  7,  8,  9, 10, 11,  1,  1,  1,  1,  1,  1]],

       [[12, 13, 14, 15, 16, 17,  1,  1,  1,  1,  1,  1],
        [18, 19, 20, 21, 22, 23,  1,  1,  1,  1,  1,  1]],

       [[24, 25, 26, 27, 28, 29,  1,  1,  1,  1,  1,  1],
        [30, 31, 32, 33, 34, 35,  1,  1,  1,  1,  1,  1]],

       [[36, 37, 38, 39, 40, 41,  1,  1,  1,  1,  1,  1],
        [42, 43, 44, 45, 46, 47,  1,  1,  1,  1,  1,  1]]])]

# frompyfunc
>>> np.frompyfunc(lambda *xy: np.concatenate(xy, 2), 2, 1)(data, features)
array([array([[[ 0,  1,  2,  3,  4,  5,  1,  1,  1,  1,  1,  1],
        [ 6,  7,  8,  9, 10, 11,  1,  1,  1,  1,  1,  1]],

       [[12, 13, 14, 15, 16, 17,  1,  1,  1,  1,  1,  1],
        [18, 19, 20, 21, 22, 23,  1,  1,  1,  1,  1,  1]]]),
       array([[[ 0,  1,  2,  3,  4,  5,  1,  1,  1,  1,  1,  1],
        [ 6,  7,  8,  9, 10, 11,  1,  1,  1,  1,  1,  1]],

       [[12, 13, 14, 15, 16, 17,  1,  1,  1,  1,  1,  1],
        [18, 19, 20, 21, 22, 23,  1,  1,  1,  1,  1,  1]],

       [[24, 25, 26, 27, 28, 29,  1,  1,  1,  1,  1,  1],
        [30, 31, 32, 33, 34, 35,  1,  1,  1,  1,  1,  1]]]),
       array([[[ 0,  1,  2,  3,  4,  5,  1,  1,  1,  1,  1,  1],
        [ 6,  7,  8,  9, 10, 11,  1,  1,  1,  1,  1,  1]],

       [[12, 13, 14, 15, 16, 17,  1,  1,  1,  1,  1,  1],
        [18, 19, 20, 21, 22, 23,  1,  1,  1,  1,  1,  1]],

       [[24, 25, 26, 27, 28, 29,  1,  1,  1,  1,  1,  1],
        [30, 31, 32, 33, 34, 35,  1,  1,  1,  1,  1,  1]],

       [[36, 37, 38, 39, 40, 41,  1,  1,  1,  1,  1,  1],
        [42, 43, 44, 45, 46, 47,  1,  1,  1,  1,  1,  1]]])], dtype=object)
0 голосов
/ 30 апреля 2018

Из-за всех математических предположений, лежащих в их основе, числовые массивы должны иметь четко определенную форму. Если это не так, numpy определяет массив списков, как и в случае со вторым примером: как вы заметили, здесь вы не можете использовать np.concatenate для axis=3, поскольку массив обрабатывается как одномерный.

Возможно, вы могли бы получить что-то более близкое к своему намерению, если бы объединяли каждую переменную data с соответствующей ей переменной features, например

df_1 = np.concatenate((data_1, features_1), axis=2)
df_2 = np.concatenate((data_2, features_2), axis=2)
df_3 = np.concatenate((data_3, features_3), axis=2)
df_4 = np.concatenate((data_4, features_4), axis=2)

data = [df_1, df_2, df_3, df_4]

Однако из ваших данных я замечаю, что второе и третье измерения всегда одинаковы. Мне кажется, что вы пытаетесь собрать несколько партий разной длины, содержащих одни и те же данные. Если это так, то почему бы не объединить data_1, data_2 ecc. на 0-й оси? Это не создало бы проблемы для numpy.

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