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

118

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

Алекс Уильямс
источник

Ответы:

163

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

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

где -1выводит размер нового измерения из размера входного массива.

Мэтт Болл
источник
44

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

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

    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вместо этого будет скопирован массив. Обратите внимание, что np.reshapeтакже принимает необязательное ключевое слово, orderкоторое позволяет вам переключаться с строкового порядка C на основной порядок столбцов 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)
Пьер GM
источник
9

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

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

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

ДжошАдель
источник
4

Если ваша единственная цель - преобразовать 1d-массив X в 2d-массив, просто выполните:

X = np.reshape(X,(1, X.size))
Arun
источник
0
import numpy as np
array = np.arange(8) 
print("Original array : \n", array)
array = np.arange(8).reshape(2, 4)
print("New array : \n", array)
Аюш Капри
источник
1
Лучше, если вы включите какое-то объяснение вместе с кодом.
Сид
Можете ли вы объяснить, чем ваш ответ сейчас отличается от предыдущего, а также от других ответов выше, в которых также используется np.reshape?
StupidWolf
0
some_array.shape = (1,)+some_array.shape

или получите новый

another_array = numpy.reshape(some_array, (1,)+some_array.shape)

Это сделает размеры +1, что равносильно добавлению скобки на крайний край.

ZDL-так
источник
-1

Вы можете использовать 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]
Рафи
источник
AttributeError: module 'numpy' has no attribute 'flatten'
Jamie F
1
Не могли бы вы поделиться своим кодом? Потому что у numpy точно есть flattenметод: docs.scipy.org/doc/numpy/reference/generated/…
Рафи
-2

Измените 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)
Аюш Капри
источник