изменить ndarrays по сравнению с обычными массивами в NumPy? - PullRequest
2 голосов
/ 30 января 2012

У меня есть объект типа 'numpy.ndarray', называемый "myarray", который при выводе на экран с использованием "print" в python выглядит как хиты

[[[ 84   0 213 232] [153   0 304 363]]
 [[ 33   0  56 104] [ 83   0  77 238]]
 [[ 0  0  9 61] [ 0  0  2 74]]]

"myarray" сделан другой библиотекой. Значение myarray.shape равно (3, 2). Я ожидал, что это будет трехмерный массив с тремя индексами. Когда я пытаюсь сделать эту структуру самостоятельно, используя:

second_array = array([[[84, 0, 213, 232], [153, 0, 304, 363]],
 [[33, 0, 56,  104], [83,  0, 77,  238]],
 [[0,  0, 9,   61],  [0,   0,  2, 74]]])

Я понял, что second_array.shape равно (3, 2, 4), как и ожидалось. Почему эта разница? Кроме того, учитывая это, как я могу изменить форму «myarray», чтобы два столбца были объединены, то есть, чтобы в результате получилось:

[[[ 84   0 213 232 153   0 304 363]]
 [[ 33   0  56 104  83   0  77 238]]
 [[ 0  0  9 61  0  0  2 74]]]

Редактировать: , чтобы уточнить, я знаю, что в случае second_array я могу сделать second_array.reshape((3,8)). Но как это работает для ndarray, который имеет формат myarray, но не имеет трехмерного индекса?

myarray.dtype - это "object", но его можно изменить и на ndarray.

Редактировать 2 : приближается, но все еще не может получить ravel / flatten с последующим изменением формы. У меня есть:

a = array([[1, 2, 3],
       [4, 5, 6]])
b = array([[ 7,  8,  9],
       [10, 11, 12]])
arr = array([a, b])

Я пытаюсь:

arr.ravel().reshape((2,6))

Но это дает [[1, 2, 3, 4, 5, 6], ...], а я хотел [[1, 2, 3, 7, 8, 9], ...]. Как это можно сделать?

спасибо.

1 Ответ

3 голосов
/ 30 января 2012

Действительно, ravel и hstack могут быть полезными инструментами для изменения формы массивов:

import numpy as np

myarray = np.empty((3,2),dtype = object)
myarray[:] = [[np.array([ 84,   0, 213, 232]), np.array([153, 0, 304, 363])],
 [np.array([ 33,   0,  56, 104]), np.array([ 83,   0,  77, 238])],
 [np.array([ 0, 0,  9, 61]), np.array([ 0,  0,  2, 74])]]

myarray = np.hstack(myarray.ravel()).reshape(3,2,4)
print(myarray)
# [[[ 84   0 213 232]
#   [153   0 304 363]]

#  [[ 33   0  56 104]
#   [ 83   0  77 238]]

#  [[  0   0   9  61]
#   [  0   0   2  74]]]

myarray = myarray.ravel().reshape(3,8)
print(myarray)
# [[ 84   0 213 232 153   0 304 363]
#  [ 33   0  56 104  83   0  77 238]
#  [  0   0   9  61   0   0   2  74]]

Относительно редактирования 2:

import numpy as np

a = np.array([[1, 2, 3],
       [4, 5, 6]])
b = np.array([[ 7,  8,  9],
       [10, 11, 12]])
arr = np.array([a, b])
print(arr)
# [[[ 1  2  3]
#   [ 4  5  6]]

#  [[ 7  8  9]
#   [10 11 12]]]

Обратите внимание, что

In [45]: arr[:,0,:]
Out[45]: 
array([[1, 2, 3],
       [7, 8, 9]])

Поскольку вы хотите, чтобы первая строка была [1,2,3,7,8,9], приведенное выше показывает, что вы хотите, чтобы вторая ось была первой осью.Это может быть выполнено с помощью метода swapaxes:

print(arr.swapaxes(0,1).reshape(2,6))
# [[ 1  2  3  7  8  9]
#  [ 4  5  6 10 11 12]]

Или, учитывая a и b или, что эквивалентно, arr[0] и arr[1], вы можете сформировать arr непосредственно сhstack метод:

arr = np.hstack([a, b])
# [[ 1  2  3  7  8  9]
#  [ 4  5  6 10 11 12]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...