Понимание _r от numpy - PullRequest
       0

Понимание _r от numpy

0 голосов
/ 23 марта 2020
a = np.zeros([4, 4])
b = np.ones([4, 4])
#vertical stacking(ROW WISE)
print(np.r_[a,b])

print(np.r_[[1,2,3],0,0,[4,5,6]])

# output is 
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]

[1 2 3 0 0 4 5 6]

Но здесь np._r не выполняет вертикальное наложение, а горизонтальное наложение. Как работает np._r? Буду благодарен за любую помощь

1 Ответ

1 голос
/ 24 марта 2020
In [324]: a = np.zeros([4, 4],int) 
     ...: b = np.ones([4, 4],int)                                                                                    
In [325]: np.r_[a,b]                                                                                                 
Out[325]: 
array([[0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]])

Это стек row; такой же как vstack. И так как массивы уже 2d, достаточно concatenate:

In [326]: np.concatenate((a,b), axis=0)                                                                              
Out[326]: 
array([[0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1],
       [1, 1, 1, 1]])

При сочетании 1d и скаляров r_ совпадает с hstack:

In [327]: np.r_[[1,2,3],0,0,[4,5,6]]                                                                                 
Out[327]: array([1, 2, 3, 0, 0, 4, 5, 6])
In [328]: np.hstack([[1,2,3],0,0,[4,5,6]])                                                                           
Out[328]: array([1, 2, 3, 0, 0, 4, 5, 6])
In [329]: np.concatenate([[1,2,3],0,0,[4,5,6]],axis=0)                                                               
...
ValueError: all the input arrays must have same number of dimensions, but the array at index 0 has 1 dimension(s) and the array at index 1 has 0 dimension(s)

concatenate не из-за скаляров. Другие методы сначала преобразуют их в 1d массивы.

В обоих случаях r_ делает

Переводит объекты среза в конкатенацию по первой оси.

r_ на самом деле является экземпляром специального класса с собственным методом __getitem__, который позволяет нам использовать [] вместо (). Это также означает, что он может принимать срезы в качестве входных данных (которые фактически отображаются как np.arange или np.linspace).

r_ принимает необязательный начальный строковый аргумент, который, если состоит из 3 чисел, может управлять объединяет axis и контролирует, как входы корректируются в соответствии с размерами. Подробности смотрите в документации, и файл np.lib.index_tricks.py для подробностей.

В порядке важности я думаю, что объединенные функции:

 np.concatenate    # base
 np.vstack         # easy join 1d arrays into 2d
 np.stack          # generalize np.array
 np.hstack         # saves specifying axis
 np.r_             
 np.c_

r_ и c_ могут выполнять аккуратные вещи при смешивании массивов разных форм, но все сводится к правильному использованию concatanate.

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