Я хочу изменить 2D-массив в 3D-массив - PullRequest
0 голосов
/ 27 апреля 2018

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

for i in range(len(array)):
    i = np.reshape(i,(2,2,2))
    print(i)

переменная i имеет массив четных чисел, например [["100","150","2","4"],["140","120","3","5"]] или

[[“1”,”5”,”6”,”2”],[“4”,”2”,”3”,”7”],[“7”,”5”,”6”,”6”],[“9”,”1”,”8”,”3”],[“3”,”4”,”5”,”6”],[“7”,”8”,”9”,”2”],,[“1”,”5”,”2”,”8”],[“6”,”7”,”2”,”1”],[“9”,”3”,”1”,”2”],[“6”,”8”,”3”,”3”]]

Длина составляет> = 6. Когда я запускаю эти коды, ValueError: не может преобразовать массив размером 148 в shape (2,2,2), возникает ошибка. Мой идеальный выход -

[[['100', '150'], ['2', '4']], [['140', '120'], ['3', '5']]] or [[[“1”,”5”],[”6”,”2”]],[[“4”,”2”],[”3”,”7”]],[[“7”,”5”],[”6”,”6”]],[[“9”,”1”],[”8”,”3”]],[[“3”,”4”],[”5”,”6”]],[[“7”,”8”],[”9”,”2”]],[[“1”,”5”],[”2”,”8”]],[[“6”,”7”],[”2”,”1”]],[[“9”,”3”],[[”1”,”2”]],[[“6”,”8”],[”3”,”3”]]] 

Я переписал коды y = [[x[:2], x[2:]] for x in i], но вывод не мой идеальный. Что не так в моих кодах?

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Прежде всего, вы упускаете смысл изменения формы. Допустим, ваш исходный массив имеет форму (A, B), и вы хотите изменить его форму (M, N, O), вы должны убедиться, что A * B = M * N * O. Очевидно, 148! = 2 * 2 * 2, верно?

В вашем случае вы хотите преобразовать массив формы (N, 4) в массив формы (N, 2, 2). Вы можете сделать как ниже:

x = np.reshape(y, (-1, 2, 2))

Надеюсь, эта помощь:)

0 голосов
/ 27 апреля 2018
In [76]: arr = np.arange(24).reshape(3,8)
In [77]: for i in range(len(arr)):
    ...:     print(i)
    ...:     i = np.reshape(i, (2,2,2))
    ...:     print(i)
    ...:     
0
....

AttributeError: 'int' object has no attribute 'reshape'

len(arr) равно 3, поэтому range(3) дает значения 0,1,2. Вы не можете изменить номер 0.

Или вы хотели изменить arr[0], arr[1] и т. Д.?

In [79]: for i in arr:
    ...:     print(i)
    ...:     i = np.reshape(i, (2,2,2))
    ...:     print(i)
    ...:     
[0 1 2 3 4 5 6 7]
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
[ 8  9 10 11 12 13 14 15]
[[[ 8  9]
  [10 11]]

 [[12 13]
  [14 15]]]
[16 17 18 19 20 21 22 23]
[[[16 17]
  [18 19]]

 [[20 21]
  [22 23]]]

Это работает - вроде. Отпечатки выглядят нормально, но arr само не меняется:

In [80]: arr
Out[80]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7],
       [ 8,  9, 10, 11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20, 21, 22, 23]])

Это потому, что i является переменной итерации. Присвоение ему нового значения не меняет исходный объект. Если это сбивает с толку, вам нужно пересмотреть базовую итерацию Python.

Или мы могли бы перебрать диапазон и использовать его в качестве индекса:

In [81]: for i in range(len(arr)):
    ...:     print(i)
    ...:     x = np.reshape(arr[i], (2,2,2))
    ...:     print(x)
    ...:     arr[i] = x
    ...: 
    ...: 
    ...: 
    ...:     
0
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-81-5f0985cb2277> in <module>()
      3     x = np.reshape(arr[i], (2,2,2))
      4     print(x)
----> 5     arr[i] = x
      6 
      7 

ValueError: could not broadcast input array from shape (2,2,2) into shape (8)

Изменение формы работает, но вы не можете поместить массив (2,2,2) обратно в слот формы (8,). Количество элементов правильное, а форма - нет.

Другими словами, вы не можете изменить форму массива по частям. Вы должны изменить все это. (Если бы arr был списком списков, этот вид частичного изменения формы работал бы.)

In [82]: np.reshape(arr, (3,2,2,2))
Out[82]: 
array([[[[ 0,  1],
         [ 2,  3]],

        [[ 4,  5],
         [ 6,  7]]],


       [[[ 8,  9],
         [10, 11]],

        [[12, 13],
         [14, 15]]],


       [[[16, 17],
         [18, 19]],

        [[20, 21],
         [22, 23]]]])
0 голосов
/ 27 апреля 2018

Вам не нужно зацикливаться, чтобы изменить, как вы хотите, просто используйте arr.reshape((-1,2,2))

In [3]: x = np.random.randint(low=0, high=10, size=(2,4))

In [4]: x
Out[4]:
array([[1, 1, 2, 5],
       [8, 8, 0, 5]])

In [5]: x.reshape((-1,2,2))
Out[5]:
array([[[1, 1],
        [2, 5]],

       [[8, 8],
        [0, 5]]])

Этот подход будет работать для обоих ваших массивов. -1 в качестве первого аргумента означает, что numpy выведет значение неизвестного измерения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...