programing

numpy.array 형상(R, 1)과 (R,)의 차이

javaba 2022. 12. 25. 11:09
반응형

numpy.array 형상(R, 1)과 (R,)의 차이

»numpy(R, 1)는 돌아온다.(R,) 곱셈이 더 명시적인 것은 매트릭스 곱셈입니다.reshape필수 항목입니다.들어 「」가 되면, 「」가 됩니다.Mnumpy.dot(M[:,0], numpy.ones((1, R)))서 ''는R행의 개수입니다(물론 같은 문제가 열 단위에서도 발생합니다). 이번에는 ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㄹ게요.matrices are not aligned입니다.M[:,0]가 좋다(R,)numpy.ones((1, R))가 좋다(1, R).

그래서 질문하겠습니다.

  1. 과 모양은 어떤 가 있나요?(R, 1) ★★★★★★★★★★★★★★★★★」(R,)말 그대로 숫자 목록과 모든 목록에 숫자만 포함된 목록인 것을 알고 있습니다.하지 않는지 요.numpy(R, 1)(R,)이데올로기 때문에

  2. 의의 예예 해해 ??? ?? ???을 바꾸지 않고: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을 합니다.matrixndarray 배열로하고 연산자 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 vector2d 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) 예를 들어, 외부 제품을 계산하고 있기 때문에, 이 작업은 외부 제품을 사용하지 않고 실행할 수 있습니다.reshapenp.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]
    ]
)

첫 번째 질문에 대한 답은 다음과 같습니다.

  1. 모양(R, 1)과 모양(R,)의 차이점은 무엇입니까?

답변: 차원이 다릅니다. a 길이입니다.b 것의.shape(a, b) ★★★★★★★★★★★★★★★★★」(a,)각각 다음과 같다. b1번으로 하다.할 수 있는 한 가지 은 '이러다'가 '이러다a = 1일등공신이다 ifb = 1이므로, 「1」은 「1」입니다.numpy.ndarray을 사용하다

  1. 위의 예에 대해 더 나은 방법이 있습니까?

답변: 위의 예에서 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)

자원

  1. NumPy :ndarrays : https://numpy.org/doc/stable/reference/arrays.ndarray.html
  2. 크로스 검증 완료 @unutbu - 차원 트릭 - https://stats.stackexchange.com/a/285005

언급URL : https://stackoverflow.com/questions/22053050/difference-between-numpy-array-shape-r-1-and-r

반응형