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
.