Перетворіть 1D масив у 2D масив у numpy


118

Я хочу перетворити одновимірний масив у двовимірний масив, вказавши кількість стовпців у двовимірному масиві. Щось, що спрацювало б так:

> 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яке дозволяє переходити від основного рядка до порядку замовлення 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)

9

Спробуйте щось на кшталт:

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

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


4

Якщо Вашою єдиною метою є перетворення 1d масиву X у 2d масив, просто виконайте такі дії:

X = np.reshape(X,(1, X.size))

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, що дорівнює додавання дужки на самій зовнішній стороні


-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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.