скучные лекционные заметки, пример создания массива - PullRequest
0 голосов
/ 12 мая 2019

В лексических заметках для индексирование

Существует пример проблемы с созданием этого массива.

[[0., 0., 0., 0., 0.],
 [2., 0., 0., 0., 0.],
 [0., 3., 0., 0., 0.],
 [0., 0., 4., 0., 0.],
 [0., 0., 0., 5., 0.],
 [0., 0., 0., 0., 6.]]

Для меня проблема в том, чтобы получить дополнительныйпустой ряд наверху.Как мне получить пример?

Это мой текущий код.

d =np.zeros([5,],dtype=int) + np.diag(arange(2,7,1))

d
Out[66]: 
array([[2, 0, 0, 0, 0],
       [0, 3, 0, 0, 0],
       [0, 0, 4, 0, 0],
       [0, 0, 0, 5, 0],
       [0, 0, 0, 0, 6]])

Ответы [ 5 ]

4 голосов
/ 12 мая 2019

Вы можете сделать это с помощью diag и выполнить индексирование в одиночку, используя аргумент k для diag:

np.diag(np.arange(2,7), k = -1)

:

array([[0, 0, 0, 0, 0, 0],
       [2, 0, 0, 0, 0, 0],
       [0, 3, 0, 0, 0, 0],
       [0, 0, 4, 0, 0, 0],
       [0, 0, 0, 5, 0, 0],
       [0, 0, 0, 0, 6, 0]])

Это почти верно.Вам просто нужно потерять последний столбец, который вы можете сделать со срезом:

np.diag(np.arange(2,7), k = -1)[:, :-1]

, который дает желаемый результат:

array([[0, 0, 0, 0, 0],
       [2, 0, 0, 0, 0],
       [0, 3, 0, 0, 0],
       [0, 0, 4, 0, 0],
       [0, 0, 0, 5, 0],
       [0, 0, 0, 0, 6]])
2 голосов
/ 12 мая 2019

Вот способ генерации массива без diag.Вместо этого я индексирую диагональный набор элементов в массиве zeros:

In [167]: x = np.zeros((6,5))                                                     
In [168]: x[np.arange(1,6), np.arange(5)] = np.arange(2,7)                        
In [169]: x                                                                     
Out[169]: 
array([[0., 0., 0., 0., 0.],
       [2., 0., 0., 0., 0.],
       [0., 3., 0., 0., 0.],
       [0., 0., 4., 0., 0.],
       [0., 0., 0., 5., 0.],
       [0., 0., 0., 0., 6.]])
2 голосов
/ 12 мая 2019

Использование np.append:

>>> zero_row = np.zeros((1,5))
>>> matrix   = np.diag(np.arange(2,7,1))
>>> np.append(zero_row, matrix, axis=0)
<<< array([[0., 0., 0., 0., 0.],
           [2., 0., 0., 0., 0.],
           [0., 3., 0., 0., 0.],
           [0., 0., 4., 0., 0.],
           [0., 0., 0., 5., 0.],
           [0., 0., 0., 0., 6.]])
1 голос
/ 12 мая 2019

Вы также можете использовать reshape примерно так:

out = np.zeros((6, 5))                                                              
out.reshape(5, 6)[:, 5] = np.arange(2, 7)                                            
out                                                                                                         
# array([[0., 0., 0., 0., 0.],
#        [2., 0., 0., 0., 0.],
#        [0., 3., 0., 0., 0.],
#        [0., 0., 4., 0., 0.],
#        [0., 0., 0., 5., 0.],
#        [0., 0., 0., 0., 6.]])

или очень похоже:

out = np.zeros((6, 5))
out.reshape(-1)[5::6] = np.arange(2, 7)
out
# array([[0., 0., 0., 0., 0.],
#        [2., 0., 0., 0., 0.],
#        [0., 3., 0., 0., 0.],
#        [0., 0., 4., 0., 0.],
#        [0., 0., 0., 5., 0.],
#        [0., 0., 0., 0., 6.]])

Оба эти метода быстрее, чем все, что опубликовано до сих пор:

import numpy as np
from timeit import timeit

def od_hpj():
    out = np.zeros((6, 5))
    out[np.arange(1,6), np.arange(5)] = np.arange(2,7)                        
    return out

def od_mm():
    return np.diag(np.arange(2,7), k = -1)[:, :-1]

def od_ks():
    m = np.zeros([5,])
    n = np.diag(np.arange(2,7,1))
    return np.vstack((m,n))

def od_as():
    zero_row = np.zeros((1,5))
    matrix   = np.diag(np.arange(2,7,1))
    return np.append(zero_row, matrix, axis=0)

def od_pp1():
    out = np.zeros((6, 5))
    out.reshape(5, 6)[:, 5] = np.arange(2, 7)
    return out

def od_pp2():
    out = np.zeros((6, 5))
    out.reshape(-1)[5::6] = np.arange(2, 7)
    return out

for n, o in list(globals().items()):
    if n.startswith("od_"):
        print(f"{n.replace('od_', ''):3s}: {timeit(o):.3f} us")

Пример прогона:

hpj: 3.379 us
mm : 2.952 us
ks : 7.804 us
as : 5.222 us
pp1: 1.735 us
pp2: 2.418 us
1 голос
/ 12 мая 2019
import numpy as np

m = np.zeros([5,])
n = np.diag(np.arange(2,7,1))

m = np.vstack((m,n))
print(m)

Мы можем использовать vstack

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