Вставка шва в массивах Numpy - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь узнать о вставке шва. Для начала, я начал играть с массивом NumPy. Допустим, массив имеет высоту 5 и ширину 5

    a b c d e
    f g h i j
    k l m n o
    p q r s t
    u v w x y

У меня есть список списков, в которых я сохранил координаты, в которые необходимо вставить новые элементы. Например, если мне нужно вставить два шва сверху вниз, у меня есть список = [[4,4,3,4,4], [3,3,3,2,3]]. Говоря в основном, я буду вставлять элементы таким образом, чтобы массив выглядел так:

        a b * c * d e
        f g * h * i j
        k l * * m n o
        p * q r * s t
        u v * w * x y

Я новичок в numpy, и я начал писать код, похожий на:

for num in range(len(list)):
    for row in range(height):
        col = list[num][row]

, которыйПозволяет мне получить доступ к позиции в массиве, куда элемент должен идти, но я не уверен, как вставить элементы и расширить массив и повторить для n раз

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Вы можете сделать это, используя любой из следующих двух методов:

  1. Метод-1: Использование numpy.array
  2. Метод-2: Использование list.insert()

Решение

import numpy as np

a = np.array(list('abcdefghijklmnopqrstuvwxy')).reshape(5,5)
coords = [[0,0,1,1,2,2,3,3,4,4], [2,4,2,4,2,3,1,4,2,4]]
coords = np.array(coords).T

# Prep New Array with Extended Dimensions
unique, counts = np.unique(coords[:,0], return_counts=True)
b = np.empty((a.shape[0], a.shape[1] + int(counts.max())))

Метод 1: использование массива Numpy

bb = b.copy().astype(int).astype(str)
bb[coords[:,0], coords[:,1]] = '*'
bb[bb!='*'] = a.astype(str).flatten().copy()

print('\nMethod-1: Using numpy array\n')
display(bb)

Метод 2: использование метода list.insert ()

bbb = b.astype(str)
target_rows = np.unique(coords[:,0])
for row in range(b.shape[0]):
    if row in target_rows:
        cols = coords[coords[:,0]==row][:,1]
        c = list(a[row,:])
        for col in cols:            
            c.insert(col,'*')
            #print(c)
        bbb[row,:] = np.array(c.copy()).astype(str)

print('\nMethod-2: Using list.index()\n')
display(bbb)

Выход

Method-1: Using numpy array

array([['a', 'b', '*', 'c', '*', 'd', 'e'],
       ['f', 'g', '*', 'h', '*', 'i', 'j'],
       ['k', 'l', '*', '*', 'm', 'n', 'o'],
       ['p', '*', 'q', 'r', '*', 's', 't'],
       ['u', 'v', '*', 'w', '*', 'x', 'y']], dtype='<U21')

Method-2: Using list.index()

array([['a', 'b', '*', 'c', '*', 'd', 'e'],
       ['f', 'g', '*', 'h', '*', 'i', 'j'],
       ['k', 'l', '*', '*', 'm', 'n', 'o'],
       ['p', '*', 'q', 'r', '*', 's', 't'],
       ['u', 'v', '*', 'w', '*', 'x', 'y']], dtype='<U32')
1 голос
/ 04 октября 2019

Настройка:

In [379]: arr = np.arange(25).reshape(5,5)                                      
In [380]: idn = np.array([[2,2,2,1,2],[4,4,3,4,4]])                             

Создание массива результатов правильного размера и массива логических масок:

In [381]: res = np.ones((5,7),int)*-1                                           
In [382]: mask = np.ones((5,7), bool)                

True для исходных значений, False для значений шва

In [383]: mask[np.arange(5),idn]=False                                          
In [384]: mask                                                                  
Out[384]: 
array([[ True,  True, False,  True, False,  True,  True],
       [ True,  True, False,  True, False,  True,  True],
       [ True,  True, False, False,  True,  True,  True],
       [ True, False,  True,  True, False,  True,  True],
       [ True,  True, False,  True, False,  True,  True]])

Первая попытка назначения:

In [385]: res[mask]=arr                                                         
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-385-30180821d500> in <module>
----> 1 res[mask]=arr

TypeError: NumPy boolean array indexing assignment requires a 0 or 1-dimensional input, input has 2 dimensions

res[mask] является массивом 1d, поэтому назначение также должно быть 1d:

In [386]: res[mask]=arr.ravel()                                                 
In [387]: res                                                                   
Out[387]: 
array([[ 0,  1, -1,  2, -1,  3,  4],
       [ 5,  6, -1,  7, -1,  8,  9],
       [10, 11, -1, -1, 12, 13, 14],
       [15, -1, 16, 17, -1, 18, 19],
       [20, 21, -1, 22, -1, 23, 24]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...