답변:
보다 간단한 해결책과 부팅 속도가 더 빠르다고 생각합니다.
import numpy as np
N = 10
a = np.random.rand(N,N)
b = np.zeros((N,N+1))
b[:,:-1] = a
그리고 타이밍 :
In [23]: N = 10
In [24]: a = np.random.rand(N,N)
In [25]: %timeit b = np.hstack((a,np.zeros((a.shape[0],1))))
10000 loops, best of 3: 19.6 us per loop
In [27]: %timeit b = np.zeros((a.shape[0],a.shape[1]+1)); b[:,:-1] = a
100000 loops, best of 3: 5.62 us per loop
a = np.random.rand((N,N))
에a = np.random.rand(N,N)
np.r_[ ... ]
및 np.c_[ ... ]
유용한 대안이다 vstack
및 hstack
대괄호 [] 대신에 라운드 ()와 함께,.
몇 가지 예 :
: import numpy as np
: N = 3
: A = np.eye(N)
: np.c_[ A, np.ones(N) ] # add a column
array([[ 1., 0., 0., 1.],
[ 0., 1., 0., 1.],
[ 0., 0., 1., 1.]])
: np.c_[ np.ones(N), A, np.ones(N) ] # or two
array([[ 1., 1., 0., 0., 1.],
[ 1., 0., 1., 0., 1.],
[ 1., 0., 0., 1., 1.]])
: np.r_[ A, [A[1]] ] # add a row
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.],
[ 0., 1., 0.]])
: # not np.r_[ A, A[1] ]
: np.r_[ A[0], 1, 2, 3, A[1] ] # mix vecs and scalars
array([ 1., 0., 0., 1., 2., 3., 0., 1., 0.])
: np.r_[ A[0], [1, 2, 3], A[1] ] # lists
array([ 1., 0., 0., 1., 2., 3., 0., 1., 0.])
: np.r_[ A[0], (1, 2, 3), A[1] ] # tuples
array([ 1., 0., 0., 1., 2., 3., 0., 1., 0.])
: np.r_[ A[0], 1:4, A[1] ] # same, 1:4 == arange(1,4) == 1,2,3
array([ 1., 0., 0., 1., 2., 3., 0., 1., 0.])
(둥근 () 대신 대괄호 []의 이유는 파이썬이 예를 들어 사각형에서 1 : 4로 확장되기 때문입니다. 오버로드의 경이로움)
np.c_[ * iterable ]
. expression-lists를 참조하십시오 .
사용 numpy.append
:
>>> a = np.array([[1,2,3],[2,3,4]])
>>> a
array([[1, 2, 3],
[2, 3, 4]])
>>> z = np.zeros((2,1), dtype=int64)
>>> z
array([[0],
[0]])
>>> np.append(a, z, axis=1)
array([[1, 2, 3, 0],
[2, 3, 4, 0]])
append
실제로 전화concatenate
hstack을 사용하는 한 가지 방법 은 다음과 같습니다.
b = np.hstack((a, np.zeros((a.shape[0], 1), dtype=a.dtype)))
dtype
매개 변수를 제거하면 필요하지 않으며 심지어는 허용되지 않습니다. 솔루션이 충분히 우아하지만 어레이에 자주 "추가"해야하는 경우에는 사용하지 않도록주의하십시오. 전체 배열을 한 번에 생성하고 나중에 채울 수없는 경우 배열 목록과 hstack
한 번에 모두 생성하십시오 .
나는 다음과 같은 가장 우아한 것을 발견했다.
b = np.insert(a, 3, values=0, axis=1) # Insert values before column 3
장점은 insert
배열 내의 다른 위치에 열 (또는 행)을 삽입 할 수 있다는 것입니다. 또한 단일 값을 삽입하는 대신 전체 열을 쉽게 삽입 할 수 있습니다 (예 : 마지막 열 복제).
b = np.insert(a, insert_index, values=a[:,2], axis=1)
어느 것이나
array([[1, 2, 3, 3],
[2, 3, 4, 4]])
타이밍 insert
의 경우 JoshAdel의 솔루션보다 느릴 수 있습니다.
In [1]: N = 10
In [2]: a = np.random.rand(N,N)
In [3]: %timeit b = np.hstack((a, np.zeros((a.shape[0], 1))))
100000 loops, best of 3: 7.5 µs per loop
In [4]: %timeit b = np.zeros((a.shape[0], a.shape[1]+1)); b[:,:-1] = a
100000 loops, best of 3: 2.17 µs per loop
In [5]: %timeit b = np.insert(a, 3, values=0, axis=1)
100000 loops, best of 3: 10.2 µs per loop
insert(a, -1, ...)
열을 추가 할 수 없습니다 . 내가 대신에 그냥 붙일 것 같아요.
a.shape[axis]
. 나. 행을 추가하고 행을 추가 np.insert(a, a.shape[0], 999, axis=0)
하려면을 수행하십시오 np.insert(a, a.shape[1], 999, axis=1)
.
나는 또한이 질문에 관심이 있었고 속도를 비교했습니다.
numpy.c_[a, a]
numpy.stack([a, a]).T
numpy.vstack([a, a]).T
numpy.ascontiguousarray(numpy.stack([a, a]).T)
numpy.ascontiguousarray(numpy.vstack([a, a]).T)
numpy.column_stack([a, a])
numpy.concatenate([a[:,None], a[:,None]], axis=1)
numpy.concatenate([a[None], a[None]], axis=0).T
입력 벡터에 대해 모두 동일한 작업을 수행합니다 a
. 성장 타이밍 a
:
모든 비 연속 변형 (특히 stack
/ vstack
)은 결국 모든 연속 변형보다 빠릅니다. column_stack
(명확성과 속도를 위해) 연속성이 필요한 경우 좋은 옵션으로 보입니다.
줄거리를 재현하는 코드 :
import numpy
import perfplot
perfplot.save(
"out.png",
setup=lambda n: numpy.random.rand(n),
kernels=[
lambda a: numpy.c_[a, a],
lambda a: numpy.ascontiguousarray(numpy.stack([a, a]).T),
lambda a: numpy.ascontiguousarray(numpy.vstack([a, a]).T),
lambda a: numpy.column_stack([a, a]),
lambda a: numpy.concatenate([a[:, None], a[:, None]], axis=1),
lambda a: numpy.ascontiguousarray(
numpy.concatenate([a[None], a[None]], axis=0).T
),
lambda a: numpy.stack([a, a]).T,
lambda a: numpy.vstack([a, a]).T,
lambda a: numpy.concatenate([a[None], a[None]], axis=0).T,
],
labels=[
"c_",
"ascont(stack)",
"ascont(vstack)",
"column_stack",
"concat",
"ascont(concat)",
"stack (non-cont)",
"vstack (non-cont)",
"concat (non-cont)",
],
n_range=[2 ** k for k in range(20)],
xlabel="len(a)",
logx=True,
logy=True,
)
stack
, hstack
, vstack
, column_stack
, dstack
위에 구축 된 모든 도우미 기능이 있습니다 np.concatenate
. 스택 정의 를 추적하여 np.stack([a,a])
호출 하는 것을 발견했습니다 np.concatenate([a[None], a[None]], axis=0)
. 적어도 도우미 함수만큼 빠르다 np.concatenate([a[None], a[None]], axis=0).T
는 것을 보여주기 위해 perfplot 에 추가 하는 것이 좋습니다 np.concatenate
.
c_
및column_stack
나는 생각한다 :
np.column_stack((a, zeros(shape(a)[0])))
더 우아합니다.
np.concatenate 도 작동합니다
>>> a = np.array([[1,2,3],[2,3,4]])
>>> a
array([[1, 2, 3],
[2, 3, 4]])
>>> z = np.zeros((2,1))
>>> z
array([[ 0.],
[ 0.]])
>>> np.concatenate((a, z), axis=1)
array([[ 1., 2., 3., 0.],
[ 2., 3., 4., 0.]])
np.concatenate
np.hstack
2x1, 2x2 및 2x3 매트릭스 보다 3 배 더 빠른 것 같습니다 . np.concatenate
또한 실험에서 행렬을 수동으로 빈 행렬로 복사하는 것보다 약간 빠릅니다. 아래의 Nico Schlömer의 답변과 일치합니다.
나는 성능에 중점을 둔 JoshAdel의 답변을 좋아합니다. 약간의 성능 향상은 0으로 초기화하는 오버 헤드를 피하고 덮어 쓰기 만하는 것입니다. 이것은 N이 클 때 측정 가능한 차이가 있으며 0 대신에 비어 있음을 사용하며 0의 열은 별도의 단계로 작성됩니다.
In [1]: import numpy as np
In [2]: N = 10000
In [3]: a = np.ones((N,N))
In [4]: %timeit b = np.zeros((a.shape[0],a.shape[1]+1)); b[:,:-1] = a
1 loops, best of 3: 492 ms per loop
In [5]: %timeit b = np.empty((a.shape[0],a.shape[1]+1)); b[:,:-1] = a; b[:,-1] = np.zeros((a.shape[0],))
1 loops, best of 3: 407 ms per loop
b[:,-1] = 0
. 또한 매우 큰 어레이의 경우 성능 차이 np.insert()
가 무시할 만해 져 np.insert()
간결함으로 인해 더 바람직 할 수 있습니다 .
np.insert
또한 목적을 제공합니다.
matA = np.array([[1,2,3],
[2,3,4]])
idx = 3
new_col = np.array([0, 0])
np.insert(matA, idx, new_col, axis=1)
array([[1, 2, 3, 0],
[2, 3, 4, 0]])
new_col
주어진 인덱스 앞에 idx
하나의 축을 따라 여기에 값을 삽입합니다 . 다시 말해, 새로 삽입 된 값은 idx
열 을 차지하고 원래와 그 idx
뒤로 원래 값을 이동 합니다.
insert
하나가 (이 질문에 링크 된 문서를 참조) 함수의 이름을 부여 맡기 수 있기 때문에 장소에 있지 않습니다.
Numpy의 np.append
방법은 세 개의 매개 변수를 취합니다. 첫 번째 두 개는 2D numpy 배열이고 세 번째는 추가 할 축을 지시하는 축 매개 변수입니다.
import numpy as np
x = np.array([[1,2,3], [4,5,6]])
print("Original x:")
print(x)
y = np.array([[1], [1]])
print("Original y:")
print(y)
print("x appended to y on axis of 1:")
print(np.append(x, y, axis=1))
인쇄물:
Original x:
[[1 2 3]
[4 5 6]]
Original y:
[[1]
[1]]
x appended to y on axis of 1:
[[1 2 3 1]
[4 5 6 1]]
필자의 경우 NumPy 배열에 열을 추가해야했습니다.
X = array([ 6.1101, 5.5277, ... ])
X.shape => (97,)
X = np.concatenate((np.ones((m,1), dtype=np.int), X.reshape(m,1)), axis=1)
X.shape 후 => (97, 2)
array([[ 1. , 6.1101],
[ 1. , 5.5277],
...
이를 위해 특별히 기능이 있습니다. numpy.pad라고합니다
a = np.array([[1,2,3], [2,3,4]])
b = np.pad(a, ((0, 0), (0, 1)), mode='constant', constant_values=0)
print b
>>> array([[1, 2, 3, 0],
[2, 3, 4, 0]])
다음은 docstring에서 말하는 내용입니다.
Pads an array.
Parameters
----------
array : array_like of rank N
Input array
pad_width : {sequence, array_like, int}
Number of values padded to the edges of each axis.
((before_1, after_1), ... (before_N, after_N)) unique pad widths
for each axis.
((before, after),) yields same before and after pad for each axis.
(pad,) or int is a shortcut for before = after = pad width for all
axes.
mode : str or function
One of the following string values or a user supplied function.
'constant'
Pads with a constant value.
'edge'
Pads with the edge values of array.
'linear_ramp'
Pads with the linear ramp between end_value and the
array edge value.
'maximum'
Pads with the maximum value of all or part of the
vector along each axis.
'mean'
Pads with the mean value of all or part of the
vector along each axis.
'median'
Pads with the median value of all or part of the
vector along each axis.
'minimum'
Pads with the minimum value of all or part of the
vector along each axis.
'reflect'
Pads with the reflection of the vector mirrored on
the first and last values of the vector along each
axis.
'symmetric'
Pads with the reflection of the vector mirrored
along the edge of the array.
'wrap'
Pads with the wrap of the vector along the axis.
The first values are used to pad the end and the
end values are used to pad the beginning.
<function>
Padding function, see Notes.
stat_length : sequence or int, optional
Used in 'maximum', 'mean', 'median', and 'minimum'. Number of
values at edge of each axis used to calculate the statistic value.
((before_1, after_1), ... (before_N, after_N)) unique statistic
lengths for each axis.
((before, after),) yields same before and after statistic lengths
for each axis.
(stat_length,) or int is a shortcut for before = after = statistic
length for all axes.
Default is ``None``, to use the entire axis.
constant_values : sequence or int, optional
Used in 'constant'. The values to set the padded values for each
axis.
((before_1, after_1), ... (before_N, after_N)) unique pad constants
for each axis.
((before, after),) yields same before and after constants for each
axis.
(constant,) or int is a shortcut for before = after = constant for
all axes.
Default is 0.
end_values : sequence or int, optional
Used in 'linear_ramp'. The values used for the ending value of the
linear_ramp and that will form the edge of the padded array.
((before_1, after_1), ... (before_N, after_N)) unique end values
for each axis.
((before, after),) yields same before and after end values for each
axis.
(constant,) or int is a shortcut for before = after = end value for
all axes.
Default is 0.
reflect_type : {'even', 'odd'}, optional
Used in 'reflect', and 'symmetric'. The 'even' style is the
default with an unaltered reflection around the edge value. For
the 'odd' style, the extented part of the array is created by
subtracting the reflected values from two times the edge value.
Returns
-------
pad : ndarray
Padded array of rank equal to `array` with shape increased
according to `pad_width`.
Notes
-----
.. versionadded:: 1.7.0
For an array with rank greater than 1, some of the padding of later
axes is calculated from padding of previous axes. This is easiest to
think about with a rank 2 array where the corners of the padded array
are calculated by using padded values from the first axis.
The padding function, if used, should return a rank 1 array equal in
length to the vector argument with padded values replaced. It has the
following signature::
padding_func(vector, iaxis_pad_width, iaxis, kwargs)
where
vector : ndarray
A rank 1 array already padded with zeros. Padded values are
vector[:pad_tuple[0]] and vector[-pad_tuple[1]:].
iaxis_pad_width : tuple
A 2-tuple of ints, iaxis_pad_width[0] represents the number of
values padded at the beginning of vector where
iaxis_pad_width[1] represents the number of values padded at
the end of vector.
iaxis : int
The axis currently being calculated.
kwargs : dict
Any keyword arguments the function requires.
Examples
--------
>>> a = [1, 2, 3, 4, 5]
>>> np.pad(a, (2,3), 'constant', constant_values=(4, 6))
array([4, 4, 1, 2, 3, 4, 5, 6, 6, 6])
>>> np.pad(a, (2, 3), 'edge')
array([1, 1, 1, 2, 3, 4, 5, 5, 5, 5])
>>> np.pad(a, (2, 3), 'linear_ramp', end_values=(5, -4))
array([ 5, 3, 1, 2, 3, 4, 5, 2, -1, -4])
>>> np.pad(a, (2,), 'maximum')
array([5, 5, 1, 2, 3, 4, 5, 5, 5])
>>> np.pad(a, (2,), 'mean')
array([3, 3, 1, 2, 3, 4, 5, 3, 3])
>>> np.pad(a, (2,), 'median')
array([3, 3, 1, 2, 3, 4, 5, 3, 3])
>>> a = [[1, 2], [3, 4]]
>>> np.pad(a, ((3, 2), (2, 3)), 'minimum')
array([[1, 1, 1, 2, 1, 1, 1],
[1, 1, 1, 2, 1, 1, 1],
[1, 1, 1, 2, 1, 1, 1],
[1, 1, 1, 2, 1, 1, 1],
[3, 3, 3, 4, 3, 3, 3],
[1, 1, 1, 2, 1, 1, 1],
[1, 1, 1, 2, 1, 1, 1]])
>>> a = [1, 2, 3, 4, 5]
>>> np.pad(a, (2, 3), 'reflect')
array([3, 2, 1, 2, 3, 4, 5, 4, 3, 2])
>>> np.pad(a, (2, 3), 'reflect', reflect_type='odd')
array([-1, 0, 1, 2, 3, 4, 5, 6, 7, 8])
>>> np.pad(a, (2, 3), 'symmetric')
array([2, 1, 1, 2, 3, 4, 5, 5, 4, 3])
>>> np.pad(a, (2, 3), 'symmetric', reflect_type='odd')
array([0, 1, 1, 2, 3, 4, 5, 5, 6, 7])
>>> np.pad(a, (2, 3), 'wrap')
array([4, 5, 1, 2, 3, 4, 5, 1, 2, 3])
>>> def pad_with(vector, pad_width, iaxis, kwargs):
... pad_value = kwargs.get('padder', 10)
... vector[:pad_width[0]] = pad_value
... vector[-pad_width[1]:] = pad_value
... return vector
>>> a = np.arange(6)
>>> a = a.reshape((2, 3))
>>> np.pad(a, 2, pad_with)
array([[10, 10, 10, 10, 10, 10, 10],
[10, 10, 10, 10, 10, 10, 10],
[10, 10, 0, 1, 2, 10, 10],
[10, 10, 3, 4, 5, 10, 10],
[10, 10, 10, 10, 10, 10, 10],
[10, 10, 10, 10, 10, 10, 10]])
>>> np.pad(a, 2, pad_with, padder=100)
array([[100, 100, 100, 100, 100, 100, 100],
[100, 100, 100, 100, 100, 100, 100],
[100, 100, 0, 1, 2, 100, 100],
[100, 100, 3, 4, 5, 100, 100],
[100, 100, 100, 100, 100, 100, 100],
[100, 100, 100, 100, 100, 100, 100]])