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

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

> 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"? (Я понимаю, что вы можете индексировать одномерный массив как двумерный массив, но это не вариант в моем коде - мне нужно сделать это преобразование.)

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

    Когда это возможно, new будет просто представлением начального массива a, что означает, что данные являются общими. В некоторых случаях, однако, массив new будет скорее acopy. Обратите внимание, что np.reshape также принимает необязательное ключевое слово order, которое позволяет вам перейти от строкового порядка с порядком порядка Fortran к столбцу. 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)

Ответ 3

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

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

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

Ответ 4

Измените массив 1D на 2D без использования Numpy.

l = [i for i in range(1,21)]
part = 3
new = []
start, end = 0, part


while end <= len(l):
    temp = []
    for i in range(start, end):
        temp.append(l[i])
    new.append(temp)
    start += part
    end += part
print("new values:  ", new)


# for uneven cases
temp = []
while start < len(l):
    temp.append(l[start])
    start += 1
    new.append(temp)
print("new values for uneven cases:   ", new)

Ответ 5

Вы можете использовать flatten() из пакета NumPy.

import numpy as np
a = np.array([[1, 2],
       [3, 4],
       [5, 6]])
a_flat = a.flatten()
print(f"original array: {a} \nflattened array = {a_flat}")

Выход:

original array: [[1 2]
 [3 4]
 [5 6]] 
flattened array = [1 2 3 4 5 6]