NumPy 구현 ndarray 다차원 그룹 작업
소개
NumPy의 매우 중요한 역할은 다차원 그룹의 조작을 할 수 있다는 것이다. 다차원 그룹의 대상도 ndarray라고 부른다.우리는 ndarray의 기초 위에서 일련의 복잡한 수학 연산을 진행할 수 있다.
본고는 기본적으로 흔히 볼 수 있는 ndarray 조작을 소개하여 데이터 분석에서 사용할 수 있습니다.
ndarray 만들기
ndarray를 만드는 데는 여러 가지 방법이 있습니다. 우리는 np를 사용할 수 있습니다.랜덤으로 데이터를 생성합니다.
import numpy as np
# Generate some random data
data = np.random.randn(2, 3)
data
array([[ 0.0929, 0.2817, 0.769 ],
[ 1.2464, 1.0072, -1.2962]])
임의로 만드는 것 외에 list에서 만들 수 있습니다.
data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1)
array([6. , 7.5, 8. , 0. , 1. ])
list에서 다차원 그룹을 만듭니다.
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr2 = np.array(data2)
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
np를 사용합니다.zeros는 초기 값이 0인 그룹을 만듭니다.
np.zeros(10)
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
2차원 그룹을 만들려면 다음과 같이 하십시오.
np.zeros((3, 6))
array([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]])
empty를 사용하여 3차원 그룹을 만듭니다.
np.empty((2, 3, 2))
array([[[0., 0.],
[0., 0.],
[0., 0.]],
[[0., 0.],
[0., 0.],
[0., 0.]]])
주의해야 할 것은, 여기에서 우리는 empty가 만든 수조 값이 0인 것을 보았는데, 사실은 일정한 것이 아니다. empty는 메모리에서 무작위로 공간을 선택하여 되돌아올 것이며, 이 공간에 값이 없다는 것을 보장할 수 없다.그래서 우리는 empty를 사용하여 그룹을 만든 후에 사용하기 전에 그들을 초기화하는 것을 기억해야 한다.arange를 사용하여 범위 클래스의 그룹을 만듭니다.
np.arange(15)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
배열에서 요소의 dtype을 지정합니다.
arr1 = np.array([1, 2, 3], dtype=np.float64)
arr2 = np.array([1, 2, 3], dtype=np.int32)
ndarray의 속성
데이터를 통해shape는 배열의 모양을 얻습니다.
data.shape
(2, 3)
ndim을 통해 비트 정보 얻기:
arr2.ndim
2
데이터를 통해dtype에서 구체적인 데이터 형식을 얻습니다.
data.dtype
dtype('float64')
ndarray에서 요소의 형식 변환
다음 유형의 ndarray를 만든 후 변환할 수 있습니다.
arr = np.array([1, 2, 3, 4, 5])
arr.dtype
dtype('int64')
float_arr = arr.astype(np.float64)
float_arr.dtype
dtype('float64')
위에서 우리는astype를 사용하여 int64 형식의ndarray를float64 형식으로 변환했습니다.변환 유형의 범위가 일치하지 않으면 자동으로 차단됩니다.
arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
arr.astype(np.int32)
array([ 3, -1, -2, 0, 12, 10], dtype=int32)
주의해라, 여기는 소수를 절단한 것이지, 위로 향하거나 아래로 정돈하지 않았다.ndarray의 수학 연산
수조는 상수와 연산할 수도 있고 수조와 연산할 수도 있다.
arr = np.array([[1., 2., 3.], [4., 5., 6.]])
arr * arr
array([[ 1., 4., 9.],
[16., 25., 36.]])
arr + 10
array([[11., 12., 13.],
[14., 15., 16.]])
arr - arr
array([[0., 0., 0.],
[0., 0., 0.]])
1 / arr
array([[1. , 0.5 , 0.3333],
[0.25 , 0.2 , 0.1667]])
arr ** 0.5
array([[1. , 1.4142, 1.7321],
[2. , 2.2361, 2.4495]])
그룹 간 비교도 가능합니다. 그룹 내의 각 요소의 크기를 비교합니다.
arr2 = np.array([[0., 4., 1.], [7., 2., 12.]])
arr2 > arr
array([[False, True, False],
[ True, False, True]])
index 및 슬라이스
기본 사용
먼저 index와 슬라이드의 기본적인 사용을 보십시오. index는 기본적으로 일반 그룹의 사용 방식과 같습니다. 그룹의 어떤 요소에 접근하는 데 사용됩니다.
절편 주의해야 할 것은 절편 후 되돌아오는 수조의 원소는 원수조의 원소의 인용이며, 절편의 수조를 수정하면 원수조에 영향을 줄 수 있다는 것이다.
#
arr = np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# index
arr[5]
5
#
arr[5:8]
array([5, 6, 7])
#
arr[5:8] = 12
array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
#
arr_slice = arr[5:8]
arr_slice[1] = 12345
arr
array([ 0, 1, 2, 3, 4, 12, 12345, 12, 8,
9])
#
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2d[2]
array([7, 8, 9])
# index
arr2d[0][2]
3
# index
arr2d[0, 2]
3
#
arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
arr3d
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
# index
arr3d[0]
array([[1, 2, 3],
[4, 5, 6]])
# copy ,
old_values = arr3d[0].copy()
arr3d[0] = 42
arr3d
array([[[42, 42, 42],
[42, 42, 42]],
[[ 7, 8, 9],
[10, 11, 12]]])
arr3d[0] = old_values
arr3d
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
# index
arr3d[1, 0]
array([7, 8, 9])
x = arr3d[1]
x
array([[ 7, 8, 9],
[10, 11, 12]])
x[0]
array([7, 8, 9])
index with slice
slice는 index로도 사용할 수 있습니다. index로 사용하면 index 범위 값을 나타냅니다.
인덱스로 표시된 슬라이스는 여러 가지 형식이 있을 수 있다.
처음부터 끝까지 index가 1부터 6-1까지 끝났다는 뜻이다.
arr[1:6]
array([ 1, 2, 3, 4, 64])
끝이 없는 것은 index가 0에서 시작하여 끝-1까지 끝난다는 것을 나타낸다.
arr2d[:2]
array([[1, 2, 3],
[4, 5, 6]])
처음부터 끝까지 모든 데이터가 끝났다는 뜻이다.
arr2d[:2, 1:]
array([[2, 3],
[5, 6]])
arr2d[1, :2]
array([4, 5])
boolean index
index는 boolean 값을 사용하여 이 index의 데이터를 선택했는지 여부를 표시할 수 있습니다.
우선 boolean 형식의 그룹을 어떻게 만드는지 봅시다.
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
names == 'Bob'
array([ True, False, False, True, False, False, False])
위에서 우리는 비교를 통해 True와 False만 포함된 수조를 되돌렸다.이 배열은 index 값으로 배열에 접근할 수 있습니다.
# 7 * 4
data = np.random.randn(7, 4)
array([[ 0.275 , 0.2289, 1.3529, 0.8864],
[-2.0016, -0.3718, 1.669 , -0.4386],
[-0.5397, 0.477 , 3.2489, -1.0212],
[-0.5771, 0.1241, 0.3026, 0.5238],
[ 0.0009, 1.3438, -0.7135, -0.8312],
[-2.3702, -1.8608, -0.8608, 0.5601],
[-1.2659, 0.1198, -1.0635, 0.3329]])
# boolean :
data[names == 'Bob']
array([[ 0.275 , 0.2289, 1.3529, 0.8864],
[-0.5771, 0.1241, 0.3026, 0.5238]])
인덱스 행에서 다음 열을 인덱스할 수도 있습니다.
data[names == 'Bob', 3]
array([0.8864, 0.5238])
~ 기호를 사용하여 반전할 수 있습니다.
data[~(names == 'Bob')]
array([[-2.0016, -0.3718, 1.669 , -0.4386],
[-0.5397, 0.477 , 3.2489, -1.0212],
[ 0.0009, 1.3438, -0.7135, -0.8312],
[-2.3702, -1.8608, -0.8608, 0.5601],
[-1.2659, 0.1198, -1.0635, 0.3329]])
우리는 실제 항목에서 매우 유용하게 사용할 수 있는 부울 그룹을 통해 값을 설정할 수 있다.
data[data < 0] = 0
array([[0.275 , 0.2289, 1.3529, 0.8864],
[0. , 0. , 1.669 , 0. ],
[0. , 0.477 , 3.2489, 0. ],
[0. , 0.1241, 0.3026, 0.5238],
[0.0009, 1.3438, 0. , 0. ],
[0. , 0. , 0. , 0.5601],
[0. , 0.1198, 0. , 0.3329]])
data[names != 'Joe'] = 7
array([[7. , 7. , 7. , 7. ],
[0. , 0. , 1.669 , 0. ],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[0. , 0. , 0. , 0.5601],
[0. , 0.1198, 0. , 0.3329]])
Fancy indexing
Fancy indexing은 꽃 색인이라고도 하는데 정수 그룹을 사용하여 색인을 하는 것을 가리킨다.
예를 들어, 먼저 8 * 4 배열을 만듭니다.
arr = np.empty((8, 4))
for i in range(8):
arr[i] = i
arr
array([[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[4., 4., 4., 4.],
[5., 5., 5., 5.],
[6., 6., 6., 6.],
[7., 7., 7., 7.]])
그리고 정수 그룹을 사용하여 인덱스하면 지정된 순서로 줄을 선택합니다.
arr[[4, 3, 0, 6]]
array([[4., 4., 4., 4.],
[3., 3., 3., 3.],
[0., 0., 0., 0.],
[6., 6., 6., 6.]])
음수 값을 사용하여 색인할 수도 있습니다.
arr[[-3, -5, -7]]
array([[5., 5., 5., 5.],
[3., 3., 3., 3.],
[1., 1., 1., 1.]])
색인을 조합하여 사용할 수도 있습니다.
arr = np.arange(32).reshape((8, 4))
arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23],
[24, 25, 26, 27],
[28, 29, 30, 31]])
위에서 우리는 8*4의 수조를 구축했다.
arr[[1, 5, 7, 2], [0, 3, 1, 2]]
array([ 4, 23, 29, 10])
그리고 그들의 2열의 첫 번째 값, 6열의 세 번째 값 등을 취한다.마지막으로 1차원 수조를 얻었다.수조 변환
우리는 서로 다른 차원의 수조 사이에서 변환할 수 있고, 수조의 축도 변환할 수 있다.
reshape 방법은 그룹을 임의의 모양으로 변환할 수 있습니다.
arr = np.arange(15).reshape((3, 5))
arr
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
배열에는 배열의 축을 조정할 수 있는 T 명령도 있습니다.
arr.T
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
고차원 그룹에 대해transpose를 사용하여 축의 전환을 할 수 있습니다.
arr = np.arange(16).reshape((2, 2, 4))
arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
arr.transpose((1, 0, 2))
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
위transpose(1,0,2)를 어떻게 이해합니까?그 의미는 x, y축을 대조하고 z축은 변하지 않는다는 것이다.
위에서 우리는reshape(2,2,4)방법을 사용하여 3차원, 즉 3개의 축의 수조를 만들었다.그 shape는 2 * 2 * 4입니다.
우선 대응 관계를 살펴보자.
(0,0)-》 [ 0, 1, 2, 3]
(0,1)-》 [ 4, 5, 6, 7]
(1,0)-》 [ 8, 9, 10, 11]
(1,1)-》 [12, 13, 14, 15]
변환 후:
(0,0)-》 [ 0, 1, 2, 3]
(0,1)-》 [ 8, 9, 10, 11]
(1,0)-》[ 4, 5, 6, 7]
(1,1)-》 [12, 13, 14, 15]
그래서 우리 위의 결과를 얻었다.
다차원 수조의 축 전환은 비교적 복잡할 수 있으니 여러분 많이 이해해 주십시오.
swapaxes를 사용하여 두 축을 교환할 수 있습니다. 위의 예는 다음과 같습니다.
arr.swapaxes(0,1)
NumPy가 ndarray 다차원 그룹 조작을 실현하는 것에 관한 이 글은 여기에 소개되었습니다. 더 많은 NumPy ndarray 다차원 그룹 조작 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
NumPy 구현 ndarray 다차원 그룹 작업NumPy의 매우 중요한 역할은 다차원 그룹의 조작을 할 수 있다는 것이다. 다차원 그룹의 대상도 ndarray라고 부른다.우리는 ndarray의 기초 위에서 일련의 복잡한 수학 연산을 진행할 수 있다. 본고는 기본...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.