Как создать 2D-массив в качестве кода перезаписи для метода array.reshape () - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь создать функцию преобразования массива B в массив другой формы в равном количестве элементов.

B = np.array([[2, 4, 6], [4, 8, 10]])

в array([[2, 4],[6, 4],[8, 10]])

def my_reshape (A, m, n):
    A_ravel = A.ravel()
    A_list = [i for i in A_ravel]
    print(A_list)
    print(len(A_list))

    if m*n == len(A_list):
        for elem in A_list:
            A_shape = [[elem for j in range(n)] for i in range(m)]                    
    else:
        print('Q-ty', m*n, ' - doesn't match to q-ty of list)
        A_shape = []

    return np.array(A_shape)

Но он занимает только последний элемент = 10, а не каждый из списка?

OUT: 
[2, 4, 6, 4, 8, 10]
array([[10, 10],
       [10, 10],
       [10, 10]])

Это должно быть

    array([[2, 4],
           [6, 4],
           [8, 10]]

2 way

def my_reshape2 (A, m, n):

    for elem in A_list:

        array= []
        for j in range(m):
        temp=[]
            for i in range(n):
                temp.append(i)
        array.append(temp)

    return array

OUT: [[0, 1], [0, 1], [0, 1]]

Как мне написать код для переноса элементов из A в новый массив?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020
In [99]: B = np.array([[2, 4, 6], [4, 8, 10]])                                                         
In [100]: B                                                                                            
Out[100]: 
array([[ 2,  4,  6],
       [ 4,  8, 10]])

target:

In [101]: np.array([[2, 4],[6, 4],[8, 10]])                                                            
Out[101]: 
array([[ 2,  4],
       [ 6,  4],
       [ 8, 10]])

simple reshape:

In [102]: B.reshape(3,2)                                                                               
Out[102]: 
array([[ 2,  4],
       [ 6,  4],
       [ 8, 10]])

reshape говорит, что он по существу растягивает массив, а затем создает новый с новой формой:

In [103]: B.ravel()                                                                                    
Out[103]: array([ 2,  4,  6,  4,  8, 10])

Ваша цель удерживает элементы ravelled в том же порядке. Нет необходимости переупорядочивать.

Делать то же самое со списками - больше работы.

Вложенные списки легко переносятся как операция:

In [104]: B.tolist()                                                                                   
Out[104]: [[2, 4, 6], [4, 8, 10]]
In [105]: list(zip(*B.tolist()))                                                                       
Out[105]: [(2, 4), (4, 8), (6, 10)]
In [106]: B.T                                                                                          
Out[106]: 
array([[ 2,  4],
       [ 4,  8],
       [ 6, 10]])

, но вы не хочу этого.

Быстрый способ получить ваш A_list - это

In [107]: B.ravel().tolist()                                                                           
Out[107]: [2, 4, 6, 4, 8, 10]

, и один из способов собрать 3 списка из 2:

In [112]: B_list = B.ravel().tolist()                                                                  
In [113]: [[i,j] for i,j in zip(B_list[::2], B_list[1::2])]                                            
Out[113]: [[2, 4], [6, 4], [8, 10]]
0 голосов
/ 09 апреля 2020

Чтобы смоделировать эффект reshape, вы можете скопировать данные в другой массив правильной формы:

B = np.array([[2, 4, 6], [4, 8, 10]])
output = np.empty((3, 2), dtype=B.dtype)
output.ravel()[:] = B.ravel()[:]

Поскольку ravel почти всегда возвращает представление для простого ( смежных) массивов, результат, как и ожидалось:

>>> output
array([[ 2,  4],
       [ 6,  4],
       [ 8, 10]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...