Как объединить два массива таким специфическим способом

1

Я очень новичок в питоне. Я задавался вопросом, как я могу объединить массивы a и b таким конкретным способом.

Я пытался использовать stack, vstack, hstack, concatenate и многое другое, но я все еще не могу получить желаемый результат.

a=  [[   0],
     [   1],
     [   2],
     [   3],
     [   4],
     [   5],
     [   6]]

b=  [[1,2,3],
     [1,2,3],
     [1,2,3],
     [1,2,3],
     [1,2,3],
     [1,2,3],
     [1,2,3]]

c = np.somefunction(a,b)


c = [
    [[0],[1,2,3]],
    [[1],[1,2,3]],
    [[2],[1,2,3]],
    [[3],[1,2,3]],
    [[4],[1,2,3]],
    [[5],[1,2,3]],
    [[6],[1,2,3]],
    ]
  • 0
    Не следует c начинать с [[0],[1,2,3]] ?
  • 0
    является [0] действительно элемент в ? a потому что это означает, что слияние выбрасывает
Показать ещё 3 комментария
Теги:
arrays
numpy
list

4 ответа

2
Лучший ответ

Проблема в том, что у вас есть зубчатый массив. Другими словами, каждый подсписок в вашем списке списков не имеет одинаковую длину, поэтому вы не можете создать обычный массив NumPy int.

Таким образом, вы можете использовать простое понимание списка или map. Я предполагаю, что ваш список списков начинается с a [0] и заканчивается [5]:

c = [[i, j] for i, j in zip(a, b)]  # list comprehension
c = list(map(list, zip(a, b)))      # functional version

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

Преобразование этого в массив возможно, но у него будет object dtype. Для большинства целей он будет мало полезен по сравнению с обычным списком списков Python:

c_arr = np.array(c)

# array([[[0], [1, 2, 3]],
#        [[1], [1, 2, 3]],
#        [[2], [1, 2, 3]],
#        [[3], [1, 2, 3]],
#        [[4], [1, 2, 3]],
#        [[5], [1, 2, 3]]], dtype=object)
  • 0
    Есть ли разница в скорости, если мы используем то, что я делаю в своем ответе, а не две переменные?
  • 0
    @ Базингаа, Не уверен. Если есть, это маргинально. Сложность будет такой же.
Показать ещё 1 комментарий
2

Вы можете использовать список понимания. Использование concatenate из NumPy здесь не сработает из-за несоответствия размеров двух массивов. Здесь я предполагаю, что вы хотите, чтобы запустить массив a, с 1. Если нет, то вы можете просто заменить a[1:] по. a

c = [list(i) for i in zip(a[1:],b)]

[[[1], [1, 2, 3]],
 [[2], [1, 2, 3]],
 [[3], [1, 2, 3]],
 [[4], [1, 2, 3]],
 [[5], [1, 2, 3]],
 [[6], [1, 2, 3]]]
1

ааааа бум:

c = list(zip(a,b))
print([list(x) for x in c])

pyFiddle

  • 0
    Нет, это дает ... [([0], [1, 2, 3]), ([1], [1, 2, 3]), ([2], [1, 2, 3]), ([3], [1, 2, 3]), ([4], [1, 2, 3]), ([5], [1, 2, 3])]
  • 0
    @jpp разрезал бы это, если бы ОП не хотел нулевого индекса.
Показать ещё 2 комментария
0

Ваши массивы выглядят как списки, в этом случае может помочь следующее

c=[list(i) for i in zip(a,b)]

в противном случае, если они являются массивами numy, эта ссылка может вам помочь.

  • 0
    Нет, это дает ... [([0], [1, 2, 3]), ([1], [1, 2, 3]), ([2], [1, 2, 3]), ([3], [1, 2, 3]), ([4], [1, 2, 3]), ([5], [1, 2, 3])]
  • 0
    Мы можем вырезать из результирующего списка правильно?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню