Свести массив в блоки столбцов - NumPy / Python - PullRequest
1 голос
/ 25 сентября 2019

Есть ли какой-нибудь простой способ сгладить

import numpy    
np.arange(12).reshape(3,4)
Out[]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

в

array([ 0,  1,  4,  5, 8, 9, 2, 3, 6, 7, 10, 11])

Ответы [ 6 ]

2 голосов
/ 25 сентября 2019

Похоже, вы ищете конкретное количество столбцов для формирования блоков, а затем получаете элементы в каждом блоке и затем переходите к следующим.Итак, имея в виду, вот один из способов -

In [148]: a
Out[148]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

In [149]: ncols = 2 # no. of cols to be considered for each block

In [150]: a.reshape(a.shape[0],-1,ncols).swapaxes(0,1).ravel()
Out[150]: array([ 0,  1,  4,  5,  8,  9,  2,  3,  6,  7, 10, 11])

Мотивация подробно обсуждается в this post.

1 голос
/ 25 сентября 2019

Для этого я бы просто нарезал и concatenate:

n = a.shape[1]//2
np.concatenate([a[:,:n], a[:,n:]]).ravel()
# array([ 0,  1,  4,  5,  8,  9,  2,  3,  6,  7, 10, 11])
0 голосов
/ 25 сентября 2019

Вы используете numpy здесь.У него есть метод, чтобы делать именно то, что вы хотите.

import numpy as np

arr = np.arange(12).reshape(3,4)
flat = arr.flatten()

Другой подход:

a = []
[a.extend(x) for x in arr]
0 голосов
/ 25 сентября 2019

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

[[12312],[],[[]]] 
[[[2]], [4, [5, 6, [6], 6, 6, 6], 7]]
[-1, [1, [-2], 1], -1]
etc

Первый вариант (не будет работать для строки )

def flat_list(array):
    return list(flatten(array))              
def flatten(nested): 
    try:
        for sublist in nested:
            for element in flatten(sublist):
                yield element
    except TypeError:
        yield nested

Второй вариант:

def flatten(nested): #in case you got strings and you want to avoide an infinite recursion
    try:
        # Don't iterate over string-like objects:
        try: nested + ''
        except TypeError: pass
        else: raise TypeError
        for sublist in nested:
            for element in flatten(sublist):
                yield element
    except TypeError:
        yield nested
0 голосов
/ 25 сентября 2019

Другой способ:

first_list = [entry[0:2] for entry in a]
second_list = [entry[2:4] for entry in a]
flat_list = [item for sublist in first_list for item in sublist] + [item for sublist in second_list for item in sublist]

flat_list # [0, 1, 4, 5, 8, 9, 2, 3, 6, 7, 10, 11]
0 голосов
/ 25 сентября 2019

Вы можете использовать понимание списка, чтобы разделить массив на блоки, а затем использовать метод numpy.ndarray.flatten, чтобы сгладить блоки в одномерный массив (это будет работать, только если a.shape[1] делится наразмер блока n):

import numpy as np

a = np.arange(12).reshape(3, 4)

n = 2

res = np.array([a[:, i : i + n] for i in range(0, a.shape[1], n)]).flatten()

print(res)

Выход:

[ 0  1  4  5  8  9  2  3  6  7 10 11 ]
...