'필드'에 해당되는 글 2건

  1. 2016.01.29 (C언어) 구조체 필드의 초기화 1
  2. 2015.04.24 넘파이(nympy)의 필드 (내부함수)

 구조체를 초기화하는 방법은 선언과 동시에 초기화하는 방법과 이미 선언된 구조체를 초기화시키는 방법 두 가지가 있다. 선언과 동시에 초기화하는 예를 들면 다음과 같다.


ex08-01

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

int main(int argc, char **argv) {
Point a = {1.0, 1.0}; //<--
}


이렇게 Point타입으로 a란 변수를 만들면서 해당하는 값을 바로 넣어주는 방법을 사용할 수 있으며 이 방법을 사용할 때에는 해당 구조체의 멤버변수 순서와 같은 차례로 초기값을 넣어야 한다.

 구조체 변수를 먼저 선언하고 나중에 필드를 초기화시키는 방법도 있다. 같은 예를 들면 다음과 같다.


ex08-02

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

int main(int argc, char **argv) {
   Point a;
   a.x = 1.0; //<--
   a.y = 1.0; //<--
}


여기서 a.x는 a라는 구조체 변수의 필드 x를 나타낸다. a.y는 필드 y를 나타낸다. 이와 같이 구조체 변수의 필드는 점(.)으로 구분하여 접근한다.


 다른 예로 Person이라는 구조체를 작성해 보자. 필드로는 나이와 키 그리고 이름 정보를 가지고 있어야 한다..


ex08-03.c
#include <stdio.h>

typedef struct {
char strName[10];
int iAge;
float fHeight;
} Person;

int main(int argc, char **argv) {
Person park = {"salesio", 45, 171.5};
Person jang = {"sophia", 45, 165.0};
printf("name:%s, age:%d, height:%.1f\n",
             park.strName, park.iAge, park.fHeight);
printf("name:%s, age:%d, height:%.1f\n",
             jang.strName, jang.iAge, jang.fHeight);
}
실행 결과
name:salesio, age:45, height:171.5
name:sophia, age:45, height:165.0


이 예에서 Person구조체의 필드는 세 개로 strName, iAge, fHeight 이고 각각 문자열 변수, 정수형 변수, 실수형 변수이다. park과 jang이라는 Person 구조체 변수를 생성한 뒤 각각의 필드를 출력하는 예제이다.


   같은 구조체형이라면 대입연산자 =를 이용해서 모든 멤버변수의 값을 복사할 수 있다. 즉, 다른 구조체 변수의 필드값으로 새로운 구조체 변수의 필드를 초기화할 수 있다. 앞에서 예를 든 Point 구조체를 이용하여 예를 들어보자.


ex08-04.c

#include <stdio.h>

typedef struct {
double x;
double y;
} Point;

int main(int argc, char **argv) {
Point a = {1.1, 1.2};
Point b = a; // a를 이용하여 b를 초기화
Point c = b; // b를 이용하여 c를 초기화
c.y = 2.0;
printf("a = {%f, %f}\n", a.x, a.y);
printf("b = {%f, %f}\n", b.x, b.y);
printf("c = {%f, %f}\n", c.x, c.y);
}

실행 결과

a = {1.100000, 1.200000}
b = {1.100000, 1.200000}
c = {1.100000, 2.000000}


위에서 Point변수 c는 필드 y가 2.0으로 변경되었으며 출력 결과에 그것이 반영되어 있음을 알 수 있다.

Posted by 살레시오
,

  numpy를 이용해 생성된 ndarray객체는 다양한 field와 method를 갖고 있다. ndarray객체의 field/method는 dot(.)연산자를 이용하여 접근할 수 있다. (마치 C언어의 구조체나 공용체의 필드에 접근하는 방식과 같다.)

배열의 모양에 관련된 attribute 들

먼저, ​전치행렬을 구해주는 T attribute가 있다.

​-------------------------------------------------------------------------
>>> x = np.array([[1.,2.],[3.,4.]])

>>> x
array([[ 1., 2.],
​[ 3., 4.]])

>>> x.T
array([[ 1., 3.],
[ 2., 4.]])

>>> x = np.array([1.,2.,3.,4.])
>>> x
array([ 1., 2., 3., 4.])

>>> x.T # 1차원 배열에서 T attribute 는 동작하지 않는다.
array([ 1., 2., 3., 4.])
​-------------------------------------------------------------------------​​

위에서도 언급되었지만 1차 배열에서는 이것이 동작되지 않는다는 것을 주의해야 한다. 만약 배열 A의 복소전치행렬을 구하고 싶다면 A.conj().T (혹은 A.T.conj() ) 라고 하면 된다. 그리고 M이 행렬객체라면 단순히 M.H 라고 하면된다.

배열의 크기에 관련된 attribute 들

  배열의 크기에 관련된 attribute로 ndim, shape, 그리고 size가 있다. 이 중 shape는 읽기뿐만 아니라 쓰기도 가능하다.

  ndim 은 배열이 몇 차 배열인지를 알려준다.


​-------------------------------------------------------------------------
>>> x = np.array([1, 2, 3])
>>> x.ndim
1
>>> y = np.zeros((2, 3, 4))
>>> y.ndim
3
​-------------------------------------------------------------------------

​shape는 배열의 각 차수별 크기를 튜플로 반환하거나 지정해 줄 수 있다. 단, shape를 변경할 때는 변경 전과 전체 요소의 숫자가 같아야 한다.

​-------------------------------------------------------------------------
>>> x = np.array([1, 2, 3, 4])
>>> x.shape
(4,)
>>> y = np.zeros((2, 3, 4))
>>> y.shape
(2, 3, 4)
>>> y.shape = (3, 8)
>>> y
array([[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0., 0., 0., 0.]])
>>> y.shape = (3, 6)
Traceback (most recent call last): File "<stdin>", line 1, in <module>
ValueError: total size of new array must be unchanged
​-------------------------------------------------------------------------

size는 ​​전체 요소들의 개수를 반환하며 np.prod(obj.shape)와 같은 결과를 생성한다.

​-------------------------------------------------------------------------
>>> x = np.zeros((3, 5, 2), dtype=np.complex128)
>>> x.size
30
>>> np.prod(x.shape)
30
​​-------------------------------------------------------------------------

기타

​나머지 attribute 들은 다음 표에 정리하였다.

TSame as self.transpose(), except that self is returned if self.ndim < 2.
data

배열의 시작을 가리키는 파이썬 버퍼 객체 

dtype

배열 요소의 데이터형 

flags

배열의 메모리 구조에 대한 정보 

flat

배열의 1차원 반복자 

imag배열의 허수부
real배열의 실수부
size배열의 요소 전체의 개수
itemsize배열 요소의 바이트 크기
nbytes배열의 전체 요소가 차지하는 바이트 크기
ndim배열의 차수
shape배열의 차수별 크기.
stridesTuple of bytes to step in each dimension when traversing an array.
ctypesAn object to simplify the interaction of the array with the ctypes module.
baseBase object if memory is from some other object.

[#00082]

Posted by 살레시오
,