numpy.array 형상(R, 1)과 (R,)의 차이
»numpy
(R, 1)
는 돌아온다.(R,)
곱셈이 더 명시적인 것은 매트릭스 곱셈입니다.reshape
필수 항목입니다.들어 「」가 되면, 「」가 됩니다.M
numpy.dot(M[:,0], numpy.ones((1, R)))
서 ''는R
행의 개수입니다(물론 같은 문제가 열 단위에서도 발생합니다). 이번에는 ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㄹ게요.matrices are not aligned
입니다.M[:,0]
가 좋다(R,)
numpy.ones((1, R))
가 좋다(1, R)
.
그래서 질문하겠습니다.
과 모양은 어떤 가 있나요?
(R, 1)
★★★★★★★★★★★★★★★★★」(R,)
말 그대로 숫자 목록과 모든 목록에 숫자만 포함된 목록인 것을 알고 있습니다.하지 않는지 요.numpy
이(R, 1)
(R,)
이데올로기 때문에의의 예예 해해 ??? ?? ???을 바꾸지 않고:
numpy.dot(M[:,0].reshape(R, 1), numpy.ones((1, R)))
1. NumPy 도형의 의미
"말 그대로 숫자 목록과 모든 목록에 숫자만 포함된 목록인 것을 알고 있습니다."라고 적지만, 그것은 약간 도움이 되지 않는 방법입니다.
NumPy 어레이에 대해 생각할 수 있는 가장 좋은 방법은 원시 요소의 블록인 데이터 버퍼와 데이터 버퍼 해석 방법을 설명하는 뷰의 두 부분으로 구성되는 것입니다.
예를 들어, 12개의 정수로 이루어진 배열을 작성하는 경우:
>>> a = numpy.arange(12)
>>> a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
★★★★★★★★★★★★★★★.a
배열된 버퍼로 되어 있습니다
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
및 데이터 해석 방법을 설명하는 보기:
>>> a.flags
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
>>> a.dtype
dtype('int64')
>>> a.itemsize
8
>>> a.strides
(8,)
>>> a.shape
(12,)
모양은 이쪽 (12,)
배열이 0 ~ 11의 단일 인덱스에 의해 인덱싱됨을 의미합니다.으로 이 인덱스에 i
, " "a
음음음같 뭇매하다
i= 0 1 2 3 4 5 6 7 8 9 10 11
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
어레이를 재구성해도 데이터 버퍼는 변경되지 않습니다.대신 데이터를 해석하는 다른 방법을 설명하는 새 보기를 만듭니다.그 후:
>>> b = a.reshape((3, 4))
b
는 같은 있습니다.a
그러나 현재는 각각 0 ~2와 0 ~3의 2개의 인덱스에 의해 인덱스가 작성됩니다.두 인덱스에 라벨을 붙이면i
★★★★★★★★★★★★★★★★★」j
, " "b
음음음같 뭇매하다
i= 0 0 0 0 1 1 1 1 2 2 2 2
j= 0 1 2 3 0 1 2 3 0 1 2 3
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
즉, 다음과 같습니다.
>>> b[2,1]
9
두 번째 인덱스는 빠르게 변경되고 첫 번째 인덱스는 느리게 변경됨을 알 수 있습니다. 「정확하게 하다」, 「하다」를 지정할 수 .order
★★★★★★★★★★★★★★★★★★:
>>> c = a.reshape((3, 4), order='F')
그 결과 어레이는 다음과 같이 색인화 됩니다.
i= 0 1 2 0 1 2 0 1 2 0 1 2
j= 0 0 0 1 1 1 2 2 2 3 3 3
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
즉, 다음과 같습니다.
>>> c[2,1]
5
이제 어레이가 크기가 1 이상인 형상을 갖는 것이 무엇을 의미하는지 명확해졌습니다.그 후:
>>> d = a.reshape((12, 1))
d
인덱스에 첫 번째 인덱스는 되며 두 0delay 입니다.
i= 0 1 2 3 4 5 6 7 8 9 10 11
j= 0 0 0 0 0 0 0 0 0 0 0 0
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
그 때문에, 이하와 같이 됩니다.
>>> d[10,0]
10
길이 1의 치수는 (어떤 의미에서는) '공짜'이기 때문에 시내로 가는 것을 막을 수 없습니다.
>>> e = a.reshape((1, 2, 1, 6, 1))
다음과 같은 인덱스를 배열에 제공합니다.
i= 0 0 0 0 0 0 0 0 0 0 0 0
j= 0 0 0 0 0 0 1 1 1 1 1 1
k= 0 0 0 0 0 0 0 0 0 0 0 0
l= 0 1 2 3 4 5 0 1 2 3 4 5
m= 0 0 0 0 0 0 0 0 0 0 0 0
┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
│ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 10 │ 11 │
└────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
그 때문에, 이하와 같이 됩니다.
>>> e[0,1,0,0,0]
6
어레이 구현 방법에 대한 자세한 내용은 NumPy 내부 문서를 참조하십시오.
2. 어떻게 해야 하나요?
새로운 뷰가 만들어지기 때문에 필요할 때마다 그것을 사용하는 것을 두려워해서는 안 된다.어레이의 인덱스를 다른 방법으로 작성하려면 이 툴을 사용하는 것이 좋습니다.
그러나 긴 계산에서는 보통 처음에 "올바른" 모양을 가진 배열을 구성하도록 배열할 수 있기 때문에 재형성 및 전이의 수를 최소화할 수 있습니다.그러나 개편의 필요성을 초래한 실제 상황을 보지 않고서는 무엇이 바뀌어야 하는지 말하기 어렵다.
질문의 예는 다음과 같습니다.
numpy.dot(M[:,0], numpy.ones((1, R)))
이건 현실적이지 않아요.첫 번째 표현은 다음과 같습니다.
M[:,0].sum()
보다 간단하게 결과를 계산할 수 있습니다.두 번째, 0열에 대해 정말 특별한 것이 있나요?실제로 필요한 것은 다음과 같습니다.
M.sum(axis=0)
「 」의 (R,)
★★★★★★★★★★★★★★★★★」(1,R)
말 그대로 사용할 필요가 있는 인덱스의 수입니다. ones((1,R))
【1】【2D】 ones(R)
하다. 이 안 되는 벡터를 해야 합니다.일반적으로 변수가 두 개 이상의 행/열을 갖는 것이 의미가 없는 경우 단일톤의 행렬이 아니라 벡터를 사용해야 합니다.
특정의 경우, 다음의 몇개의 옵션이 있습니다.
1) 두 번째 인수를 벡터로 만듭니다.다음 동작은 정상입니다.
np.dot(M[:,0], np.ones(R))
매트릭스 2) Matlab을 합니다.matrix
ndarray
배열로하고 연산자 2D 배열로 합니다.*
는 요소별이 아닌 행렬 곱셈을 수행합니다(따라서 점이 필요하지 않습니다).내 경험상, 이것은 가치가 있는 수고이지만, 만약 당신이 matlab에 익숙해지면 좋을지도 모릅니다.
그 모양은 태플이다.차원이 1개뿐인 경우 셰이프는 숫자 1개가 되고 쉼표 뒤에 공백이 됩니다.2개 이상의 치수의 경우 쉼표 뒤에 숫자가 표시됩니다.
# 1 dimension with 2 elements, shape = (2,).
# Note there's nothing after the comma.
z=np.array([ # start dimension
10, # not a dimension
20 # not a dimension
]) # end dimension
print(z.shape)
(2,)
# 2 dimensions, each with 1 element, shape = (2,1)
w=np.array([ # start outer dimension
[10], # element is in an inner dimension
[20] # element is in an inner dimension
]) # end outer dimension
print(w.shape)
(2,1)
기본 어레이 클래스의 경우 2D 어레이는 1D 또는 3D 어레이보다 특별하지 않습니다.치수를 보존하는 작업도 있고, 축소하는 작업도 있고, 결합하거나 확장하는 작업도 있습니다.
M=np.arange(9).reshape(3,3)
M[:,0].shape # (3,) selects one column, returns a 1d array
M[0,:].shape # same, one row, 1d array
M[:,[0]].shape # (3,1), index with a list (or array), returns 2d
M[:,[0,1]].shape # (3,2)
In [20]: np.dot(M[:,0].reshape(3,1),np.ones((1,3)))
Out[20]:
array([[ 0., 0., 0.],
[ 3., 3., 3.],
[ 6., 6., 6.]])
In [21]: np.dot(M[:,[0]],np.ones((1,3)))
Out[21]:
array([[ 0., 0., 0.],
[ 3., 3., 3.],
[ 6., 6., 6.]])
같은 배열을 제공하는 다른 표현식
np.dot(M[:,0][:,np.newaxis],np.ones((1,3)))
np.dot(np.atleast_2d(M[:,0]).T,np.ones((1,3)))
np.einsum('i,j',M[:,0],np.ones((3)))
M1=M[:,0]; R=np.ones((3)); np.dot(M1[:,None], R[None,:])
MATLAB는 2D로 제작되었습니다.에서는 더 이 허용되지만 2는 됩니다.은 1열로 되어 있는 해야 합니다.(1,3)
v (3,1)
편지를 [1,2,3].'
편지를 쓰려고 했는데row vector
★★★★★★★★★★★★★★★★★」column vector
2d MATLAB입니다. 적어도 1d라는 수학적 의미의 벡터는 없습니다.
는 요?np.atleast_2d
(_1d 및 _3d 전 )
Python/에는 Python/numpy가 matmul
In [358]: M[:,0,np.newaxis]@np.ones((1,3))
Out[358]:
array([[0., 0., 0.],
[3., 3., 3.],
[6., 6., 6.]])
»numpy
요소별 곱셈은 어떤 의미에서 행렬 곱셈보다 더 기본적이다.에서는 【1】을 사용하지 dot/matmul
:
In [360]: M[:,0,np.newaxis]*np.ones((1,3))
Out[360]:
array([[0., 0., 0.],
[3., 3., 3.],
[6., 6., 6.]])
은 「」를 사용합니다.broadcasting
「」의 한 기능입니다.numpy
에야 추가하였습니다.MATLAB.
이미 좋은 답변들이 많이 있어요.그러나, 쉐이프나 어레이가 모든 프로그램을 망가뜨릴 수 있는 예를 찾기는 어려웠습니다.
그 중 하나는 다음과 같습니다.
import numpy as np
a = np.array([1,2,3,4])
b = np.array([10,20,30,40])
from sklearn.linear_model import LinearRegression
regr = LinearRegression()
regr.fit(a,b)
다음 오류와 함께 실패합니다.
Value Error: 2D 어레이가 예상되지만 1D 어레이가 필요함
, '''를 '''가?reshape
로로 합니다.a
:
a = np.array([1,2,3,4]).reshape(-1,1)
이것은 올바르게 동작합니다!
형상(n,)의 데이터 구조를 순위 1 배열이라고 합니다.행 벡터나 열 벡터로 일관되게 동작하지 않기 때문에 조작과 효과의 일부가 직관적이지 않습니다.이 (n) 데이터 구조를 전치하면 완전히 동일하게 표시되고 도트 곱은 행렬이 아닌 숫자를 제공합니다.모양(n,1) 또는 (1,n) 행 또는 열 벡터의 벡터는 훨씬 직관적이고 일관성이 있습니다.
1) 1) 은 (R, 1)
에 걸쳐서(R,)
게다가 모양은 왜 좋은가?(R, 1)
로는 "R"이 "R" 입니다.(1, R)
? 하게 하고 이 좋습니다 추가 치수가 필요할 때는 단순하고 명확하게 하는 것이 좋습니다.
2) 예를 들어, 외부 제품을 계산하고 있기 때문에, 이 작업은 외부 제품을 사용하지 않고 실행할 수 있습니다.reshape
를 np.outer
:
np.outer(M[:,0], numpy.ones((1, R)))
확실히 하기 위해서, 다음에 대해 이야기하고 있습니다.
- , NumPy 배열
numpy.ndarray
- the the the the the로 알려진 의 모양
numpy.ndarray.shape
- 은 알 수 없는 을 로 하고 있다.
numpy.ndarray
과(R,)
서 ''는R
.
NumPy 。 ★★★.shape
는 태플에 의해 표현되며, 태플의 각 요소는 해당 치수의 길이를 나타냅니다.단순하게 하기 위해 행과 열로 진행합시다.의 ★★★★★★★★★★★★★★★★★★★★★의 가치numpy.ndarray
다음 예에서는 모양이 변경되지 않습니다.
값이 1, 2, 3, 4인 배열을 생각해 보겠습니다.
는 다음과 것들이 있습니다..shape
★★★★
(4,) # 1-dimensional array with length 4
(1,4) # 2-dimensional array with row length 1, column length 4
(4,1) # 2-dimensional array with row length 4, column length 1
은 좀 더 할 수 .a
★★★★★★★★★★★★★★★★★」b
.
(a,) # 1-dimensional array with length a
(b,a) # 2-dimensional array with row length b, column length a
(a,b) # 2-dimensional array with row length a, column length b
저에게 있어, 치수가 무엇을 의미하는지 더 잘 느끼기 위해 이것들을 '수동적으로' 만드는 것이 도움이 됩니다.
>> # (4,)
>> one_dimensional_vector = np.array(
[1, 2, 3, 4]
)
>> # (1,4)
>> row_vector = np.array(
[
[1, 2, 3, 4]
]
)
>> # (4,1)
>> column_vector = np.array(
[
[1],
[2],
[3],
[4]
]
)
첫 번째 질문에 대한 답은 다음과 같습니다.
- 모양(R, 1)과 모양(R,)의 차이점은 무엇입니까?
답변: 차원이 다릅니다. a
길이입니다.b
것의.shape
(a, b)
★★★★★★★★★★★★★★★★★」(a,)
각각 다음과 같다. b
1번으로 하다.할 수 있는 한 가지 은 '이러다'가 '이러다a = 1
일등공신이다 ifb = 1
이므로, 「1」은 「1」입니다.numpy.ndarray
을 사용하다
- 위의 예에 대해 더 나은 방법이 있습니까?
답변: 위의 예에서 1, 2, 3, 4를 값으로 사용한 어레이가 있다고 가정합니다.편리한 방법(R,)
(R, 1)
을 사용하다
>> one_dimensional_array = np.array([1,2,3,4])
>> one_dimensional_array.shape
(4,)
>> row_vector = one_dimensional_array[:, None]
>> row_vector.shape
(4, 1)
자원
- NumPy :ndarrays : https://numpy.org/doc/stable/reference/arrays.ndarray.html
- 크로스 검증 완료 @unutbu - 차원 트릭 - https://stats.stackexchange.com/a/285005
언급URL : https://stackoverflow.com/questions/22053050/difference-between-numpy-array-shape-r-1-and-r
'programing' 카테고리의 다른 글
Vuex 변환을 사용하여 개체 참조를 업데이트하는 올바른 방법은 무엇입니까? (0) | 2022.12.25 |
---|---|
jQuery를 사용하여 요소로 스크롤합니다. (0) | 2022.12.25 |
kill - 3을 사용하여 Java 스레드 덤프를 가져옵니다. (0) | 2022.12.25 |
초기화되지 않은 개체 vs NULL로 초기화됨 (0) | 2022.12.25 |
Workbench를 사용하여 서버에서 데이터베이스의 ER 모델을 가져오는 방법 (0) | 2022.12.25 |