Преобразование 1D массива в 2D массив в numpy


Я хочу преобразовать 1-мерный массив в 2-мерный массив, указав количество столбцов в 2D-массиве. Что-то, что будет работать так:

> import numpy as np
> A = np.array([1,2,3,4,5,6])
> B = vec2matrix(A,ncol=2)
> B
array([[1, 2],
       [3, 4],
       [5, 6]])

есть ли у numpy функция, которая работает как моя составная функция "vec2matrix"? (Я понимаю, что вы можете индексировать массив 1D как 2D - массив, но это не вариант в коде, который у меня есть-мне нужно сделать это преобразование.)

3 54

3 ответа:

вы хотите reshape массив.

B = np.reshape(A, (-1, 2))

у вас есть два варианта:

  • Если вам больше не нужна исходная форма, проще всего просто назначить новую форму массиву

    a.shape = (a.size//ncols, ncols)
    

    вы можете переключиться между a.size//ncols by -1 для автоматического вычисления правильной формы. Убедитесь, что a.shape[0]*a.shape[1]=a.size, иначе вы столкнетесь с какой-то проблемой.

  • вы можете получить новый массив с np.reshape функция, которая работает в основном как представленная версия выше

    new = np.reshape(a, (-1, ncols))
    

    когда это возможно, new будет просто представление исходного массива a, это означает, что данные являются общими. В некоторых случаях, однако, new массив будет acopy вместо этого. Обратите внимание, что np.reshape также принимает необязательное ключевое слово order, что позволяет переключаться с строкам C до Столбцов Фортран заказа. np.reshape является версией функции a.reshape метод.

если вы не можете соблюдать требование a.shape[0]*a.shape[1]=a.size, ты застрял с необходимостью создать новый массив. Вы можете использовать np.resize функция и смешивание его с np.reshape, например

>>> a =np.arange(9)
>>> np.resize(a, 10).reshape(5,2)

попробуйте что-то вроде:

B = np.reshape(A,(-1,ncols))

вы должны убедиться, что вы можете разделить количество элементов в массиве по ncols хотя. Вы также можете играть с порядком, в котором числа втягиваются в B С помощью order ключевое слово.