Как изменить массив с определенным порядком индексации? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь преобразовать некоторые массивы в определенный порядок, но numpy.reshape не решает мою проблему, и я не хочу использовать какие-либо циклы, если мне действительно не нужно.

Давайте возьмем массив a со значениями:

a = [['x1','x2','x3','y1','y2','y3','z1','z2','z3'],
['x4','x5','x6','y4','y5','y6','z4','z5','z6']]

и np.reshape(a,[-1,18]) возвращает:

array([['x1', 'x2', 'x3', 'y1', 'y2', 'y3', 'z1', 'z2', 'z3', 
     'x4', 'x5','x6', 'y4', 'y5', 'y6', 'z4', 'z5', 'z6']], dtype='<U2')

, но возможно ли получить такой результат:

[['x1', 'x2', 'x3','x4', 'x5','x6', 'y1', 'y2', 'y3','y4', 'y5', 'y6',
 'z1', 'z2', 'z3', 'z4', 'z5', 'z6']]

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Если длины значений x, y и z совпадают, вы можете использовать np.array_split и сгладить результат с помощью .ravel():

np.array(np.array_split(a, 3, axis=1)).ravel()

array(['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'y1', 'y2', 'y3', 'y4', 'y5',
       'y6', 'z1', 'z2', 'z3', 'z4', 'z5', 'z6'], dtype='<U2')
0 голосов
/ 14 февраля 2019

Вам необходимо изменить форму и транспонировать массив:

import numpy as np

a = np.array([['x1','x2','x3','y1','y2','y3','z1','z2','z3'],
              ['x4','x5','x6','y4','y5','y6','z4','z5','z6']])
b = a.reshape(2, 3, 3).transpose((1, 0, 2)).ravel()
print(b)
# ['x1' 'x2' 'x3' 'x4' 'x5' 'x6' 'y1' 'y2' 'y3' 'y4' 'y5' 'y6' 'z1' 'z2'
#  'z3' 'z4' 'z5' 'z6']

Шаг за шагом, сначала у вас есть исходный массив.

print(a)
# [['x1' 'x2' 'x3' 'y1' 'y2' 'y3' 'z1' 'z2' 'z3']
#  ['x4' 'x5' 'x6' 'y4' 'y5' 'y6' 'z4' 'z5' 'z6']]

Затем вы изменяете его как «две матрицы 3х3»:

print(a.reshape(2, 3, 3))
# [[['x1' 'x2' 'x3']
#   ['y1' 'y2' 'y3']
#   ['z1' 'z2' 'z3']]
#
#  [['x4' 'x5' 'x6']
#   ['y4' 'y5' 'y6']
#   ['z4' 'z5' 'z6']]]

Теперь, если вы сгладите это, после x3 вы получите y1.Вам нужно изменить порядок осей, чтобы после x3 перешло x4, что означает, что вы сначала хотите перебрать столбцы (x1, x2, x3), а затем перейти к следующей матрице, чтобы перебрать столбцы вего первые строки (x4, x5, x6) и затем переход к следующей строке первой матрицы.Таким образом, самые внутренние измерения должны быть одинаковыми (столбцы), но вы должны поменять местами первые два измерения, чтобы сначала изменить матрицу, а затем строки, а не наоборот:

print(a.reshape(2, 3, 3).transpose((1, 0, 2)))
# [[['x1' 'x2' 'x3']
#   ['x4' 'x5' 'x6']]
#
#  [['y1' 'y2' 'y3']
#   ['y4' 'y5' 'y6']]
#
#  [['z1' 'z2' 'z3']
#   ['z4' 'z5' 'z6']]]

Теперь, чем может бытьсплющенный, чтобы получить желаемый результат.

print(a.reshape(2, 3, 3).transpose((1, 0, 2)).ravel())
# ['x1' 'x2' 'x3' 'x4' 'x5' 'x6' 'y1' 'y2' 'y3' 'y4' 'y5' 'y6' 'z1' 'z2'
#  'z3' 'z4' 'z5' 'z6']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...