반응형

Numpy 배열 연산

 

# 배열 연산
import numpy as np

x = np.array([[1,2], [3,4]])
y = np.arange(5, 9).reshape((2,2)) 
y = y.astype(np.float32)
print(x, type(x), x.dtype)

print(y, type(y), end='\n\n')

print(x+y, end='\n\n') # + 연산

print(np.add(x,y), end='\n\n') # + 연산

print(np.subtract(x,y), end='\n\n') # - 연산

print(x-y, end='\n\n') # - 연산

print(np.divide(x,y), end='\n\n') # / 연산

print(x*y, end='\n\n') # * 연산


# 출력 결과

[[1. 2.]
 [3. 4.]]
 
[[5. 6.]
 [7. 8.]]

[[ 6.  8.]
 [10. 12.]]

[[ 6.  8.]
 [10. 12.]]

[[-4. -4.]
 [-4. -4.]]

[[-4. -4.]
 [-4. -4.]]

[[0.2        0.33333334]
 [0.42857143 0.5       ]]

[[ 5. 12.]
 [21. 32.]]

 

행렬의 연산은 자리끼리 연산해주기 때문에 쉽게 해결하실 수 있습니다.

 

연산 결과를 보기에 앞서, reshape 라는 함수가 존재합니다.

 

reshape 함수란 배열의 차원의 크기를 변경하는 방법으로, 배열의 요소의 개수는 동일하고 배열의 차원만 변경해줍니다.

 

덧셈 -> add(배열1, 배열2) , add 대신 + 사용 가능합니다.

뺄셈 -> subtract(배열1, 배열2) , subtract 대신 - 사용 가능합니다.

곱셉 -> multiply(배열1, 배열2) , multiply 대신 * 사용 가능합니다.

나눗셈 -> divide(배열1, 배열2) , divide 대신 / 사용 가능합니다.

 

Numpy 벡터의 내적

 

벡터의 내적 함수에 대하셔 내적 계산시에는 dot 메소드를 필요로합니다.

 

형태는 다음과 같습니다.

z = dot(x,y)
z = dot(x,y,dim)

 

- 내적 함수를 계산하려면 열과 행이 일치하여야하고 만약, 일치하지 않는다면 가공을 필요로 하고 T(transform)를 이용합니다.

 

- 2차원 배열을 벡터 계산하면 1차 배열의 결과가 나오고, 1차 배열을 벡터계산하면 스칼라 결과가 출력됩니다.

 

import numpy as np
v = np.array([9,10])
w = np.array([11,12])

x = np.array([[1,2], [3,4]])
y = np.arange(5, 9).reshape((2,2))

print(v.dot(w), end='\n\n') 
print(np.dot(v, w), end='\n\n') 

print(np.dot(x, y), end='\n\n')


# 출력 결과

219

219

[[19. 22.]
 [43. 50.]]

 

v.dot(w) 의 경우 v와 w의 내적함수를 구한 것으로 (9 *11) + (10*12) 를 하여 219가 출력된 것입니다.

 

위와 동일한 식으로 np.dot(v, w) 가 있습니다. 위와 계산 방식은 동일하기에 출력 결과도 같습니다.

 

2차원 배열의 경우

 

( 1 * 5 ) + ( 2 * 7 ) = 19 값은 1행 1열에 저장

 

( 1 * 6 ) + ( 2 * 8 ) = 22 값은 1행 2열에 저장

 

( 3 * 5 ) + ( 4 * 7 ) = 43 값은 2행 1열에 저장

 

( 3 * 6 ) + ( 4 * 8 ) = 50 값은 2행 2열에 저장이 됩니다.

 

 

반응형
반응형

배열 관련 포스팅

 

2020/05/28 - [python] - [python] Numpy 데이터타입, 메모리저장, 배열

 

[python] Numpy 데이터타입, 메모리저장, 배열

Numpy 란? C언어로 개발되었으며, 계산을 위한 라이브러리로서 다차원 배열을 처리하는데 필요한 기능을 제공합니다. Numpy 데이터 타입 # numpy : ndarray import numpy as np nn = [1, 2, 3.5] nn1 = (6,7,8,9)..

lightchan.tistory.com

 

 

 

Numpy 슬라이싱

a = np.array([1,2,3,4,5])
print(a, type(a), end='\n\n')
print(a[1], end='\n\n')
print(a[1:5:2], end='\n\n')
print(a[-5:-2], end='\n\n')
print(a[1:], ' ' , a[:3], end='\n\n')

print('==========================')

a = np.array([[1,2,3,4], [5 ,6,7,8], [9,10,11,12]])
print(a, a.shape, end='\n\n')
#print(a[:])
print(a[1:], end='\n\n')
print(a[0], a[0][0],a[0,0], a[[0]], end='\n\n')
print(a[0,0], end='\n\n')


print(a[1:], end='\n\n')
print(a[1:, 0:2], end='\n\n')


b = a
print(b, end='\n\n')


# 출력 결과

[1 2 3 4 5] <class 'numpy.ndarray'>

2

[2 4]

[1 2 3]

[2 3 4 5]   [1 2 3]

[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]] (3, 4)

[[ 5  6  7  8]
 [ 9 10 11 12]]

[1 2 3 4] 1 1 [[1 2 3 4]]

1

[[ 5  6  7  8]
 [ 9 10 11 12]]

[[ 5  6]
 [ 9 10]]

[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]

 

소스코드의 일부를 보시면 a[값1:값2] 로 작성되어있는 의미는 다음과 같습니다.

 

- 1차원 배열의 자료를 출력하고, 값1+1로 시작하여 값2의 범위까지 출력하는 것을 뜻합니다.

 

그 밑의 출력 문장을 보시면 a[값1:값2:값3] 으로 값3까지 있는 문장에서는 값3만큼 띄어넘어 출력하는 것을 뜻합니다.

 

- 여기서는 1:5 만 출력한다면 2 3 4 5가 출력되겠지만 값3에 2를 넣엇기때문에 2 4 가 출력됩니다.

 

shape 함수는 해당하는 배열이 몇행 몇열의 배열인지 출력해주는 함수입니다.

 

2차원 배열에서는 행과 열로 구성되고 있기 때문에 [값1:값2 , 값3,값4] 의 범위로 지정하게 됩니다.

 

a[값1 : ] 의 경우는 값1의 행부터 마지막 행까지 출력되는 것을 의미하게 됩니다.

 

Numpy 복사하기

 

a = np.array([[1,2,3,4], [5 ,6,7,8], [9,10,11,12]])

b = a # 이건 주소치환
b[0][0] = 100
print(a)
print()
print(b)
print('**' * 10)
print()
c = np.copy(a) # 원본을 가지고 또 다른 배열주소 하나 만들어서 저장
c[0][0] = 200
print(a)
print('**'*10)
print(c)

a 배열을 만든후 주소 치환을 이용하여 b에 그대로 복사하여 동일하게 출력 된 것을 확인 할 수 있습니다.

 

그 다음 np.copy() 를 이용하여 c 에 2차원 배열 a를 다른 주소를 통하여 c에 복사하게 됩니다.

 

여기서 복사한 2차원 배열 c 의 값이 바뀌더라도 기존 a 배열에는 영향이 없습니다.

 

Numpy 의 서브Array

 

d=a[:2, 1:3]
print(a, end='\n\n') # 2   3 이 부분을 서브 array라고 한다
print(d, end='\n\n') # 6   7

print(a) 


# 출력 결과

[[100   2   3   4]
 [  5   6   7   8]
 [  9  10  11  12]]

[[2 3]
 [6 7]]

[[100   2   3   4]
 [  5   6   7   8]
 [  9  10  11  12]]

d 배열에 a 배열의 1 ~ 2행과 2 ~ 3 열의 값을 d 배열에 저장하였습니다.

 

그에따른 결과는 다음과 같으며 이것을 서브배열이라고 칭합니다. 이후 다시 a 배열을 출력해보면

 

기존 a 배열에는 영향이 없는 것을 알 수 있습니다.

 

그 외 추가 예제

 

a = np.array([[1,2,3,],[4,5,6],[7,8,9]])
r1 = a[1, :] 
print(r1)
print(r1, r1.shape)
print()

r2 = a[1:2, :]
print(r2, r2.shape)
print()


# 출력 결과

[4 5 6]
[4 5 6] (3,)

[[4 5 6]] (1, 3)

 

위에서 설명 드렸던 것처럼 .shape() 함수는 행렬의 차원을 개념으로 표현하는 것입니다.

 

여기서 r1 의 a[1, :] 는 a[1,] 과 동일한 의미로 해석 될 수 있습니다. 출력이 [4 5 6] 이지만 (3, )과 같이 출력 되는 이유는

1차원 배열 형태로 출력하였기 때문입니다.

 

그 차이를 비교하기 위해 r2 를 확인해보시면 쉽게 이해하실 수 있습니다. 

 

위에 설명을 보시면 2차원 배열의 경우 (값1 : 값2 , 값3 : 값4 ) 로 범위를 지정하여 이번에는 (1, 3) 과 같이 출력 된 것을 알 수 있습니다.

반응형
반응형

Numpy 란?

C언어로 개발되었으며, 계산을 위한 라이브러리로서 다차원 배열을 처리하는데 필요한 기능을 제공합니다.

 

 

Numpy 데이터 타입

# numpy : ndarray
import numpy as np

nn = [1, 2, 3.5]
nn1 = (6,7,8,9)
ss1 = ['tom', 'james', 'oscar']
ss2 = {'a' , 'b', 'c'}

print(nn, ' ', type(nn))
print(nn1, ' ' , type(nn1))
print(ss1, ' ' , type(ss1))
print(ss2, ' ' , type(ss2))

# 출력 결과

[1, 2, 3.5]   <class 'list'>
(6, 7, 8, 9)   <class 'tuple'>
['tom', 'james', 'oscar']   <class 'list'>
{'a', 'b', 'c'}   <class 'set'>

 

변수에 할당한 데이터와 출력 된 값 및 데이터 타입 형태를 보면 들어간 타입의 형태로 출력 되는 것을 알 수 있스니다.

 

서로 성격이 다른 타입일 경우 상위 타입을 따라서 출력됩니다.

 

- 바깥쪽이 가장 큰 상위 타입

str ( somplex ( float ( int ) ) )

 

Numpy 메모리 저장

 

파이썬과 Numpy가 차지하는 메모리에는 차이가 있다.

 

파이썬은 값에 상관없이 다 다른 메모리를 차지하는 특징이있습니다.

li = list(range(1,10))
print(li) # list 형태

print(id(li[0]), id(li[1]), id(li[2]), id(li[3]), id(li[4]), id(li[5]), id(li[6]), id(li[7]), id(li[8]))


# 출력 결과

[1, 2, 3, 4, 5, 6, 7, 8, 9]
10914496 10914528 10914560 10914592 10914624 10914656 10914688 10914720 10914752

 

출력 결과를 보시면 id 값이 전부 다른 것을 확인 할 수 있습니다.

 

반면, Numpy 의 경우 C의 배열을 사용하기 때문에 하나의 메모리 안에 데이터를 하나씩 쌓아두는 특징을 가지고 있습

니다.

 

 

numpy_arr = np.array(li)

print(id(numpy_arr[0]), id(numpy_arr[1]), id(numpy_arr[2]), id(numpy_arr[3]), id(numpy_arr[4]))


# 출력 결과

139921874137520 139921874137520 139921874137520 139921874137520 139921874137520

출력 되는 id의 값이 전부 동일한 것을 확인할 수 있습니다.

 

 

결과적으로, 데이터 분석을 할 경우 들어오는 데이터의 양이 많기 떄문에 python 의 list 를 사용하는 것이 아니라

 

Numpy의 array 배열을 사용하는 것이 더 적합한 것을 알 수 있습니다.

 

 

추가 - 위에 특징들로인해 python의 list 값에 *값 을 해주면 list를 값 만큼 반복하지만 Numpy 의 경우 각 요소들에 * 값

 

을 해주는 특징을 가집니다.

print('a ' * 10)

for i in li:
  print(i*10, end = ' ')
  

# 출력 결과

a a a a a a a a a a 
10 20 30 40 50 60 70 80 90 

 

Numpy 배열

넘파이에서 사용하는 배열은 주로 벡터와 행렬을 사용하는 선형대수 계산에 사용됩니다.

 

1차원 배열 - 리스트를 넣으면 배열로 변환

exarr = np.array([1,2,3,4,5,6,7,8,9])


# 출력 결과

[1 2 3 4 5 6 7 8 9]   <class 'numpy.ndarray'>

 

2차원 배열 - 리스트의 리스트(list of list)를 이용하는 경우 2차원 배열을 생성할 수 있습니다. 가로는 행의 개수 세로는 열의 개수가 됩니다.

 

exarr1 = np.array([[1,2,3,4],[5,6,7,8]])
print(exarr1, ' ' , type(exarr1))


# 출력 결과

[[1 2 3 4]
 [5 6 7 8]]   <class 'numpy.ndarray'>

Numpy 에서의 배열은 다른 배열과는 다른 차이점을 가지고 있습니다.

 

예를들어 아래 소스에서도 보여드리겠지만, arr[0] 과 arr[[0]] dms 다른 점을 가지고 있습니다.

 

arr[0] 은 1차원 배열 , arr[[0]] 은 2차원 배열이라는 특징을 가지고 있습니다.

 

import numpy as np

arr1 = np.array([[10,20,30], [40,50,60]], dtype='float32')
print(type(arr1), ' ' , arr1.dtype, ' ' , arr1.shape, ' ' , arr1.ndim, ' ' , arr1.size, end = '\n')

print(arr1, end = '\n\n')

print(arr1[0,0], arr1[0, 1], end = '\n\n')
arr1[0] = 10
print(arr1[0,1], arr1[0,2], end = '\n\n')

print('-------------------------')

print(arr1, end = '\n\n')

print(arr1[[0]], end = '\n\n')

print(arr1[[0,1]], end = '\n\n')

print(arr1[0], end = '\n\n')


# 출력결과

<class 'numpy.ndarray'>   float32   (2, 3)   2   6
[[10. 20. 30.]
 [40. 50. 60.]]

10.0 20.0

10.0 10.0

-------------------------

[[10. 10. 10.]
 [40. 50. 60.]]

[[10. 10. 10.]]

[[10. 10. 10.]
 [40. 50. 60.]]

[10. 10. 10.]

 

 

 

위에 소스를 보시면 arr1[0]은 1차원 배열로 list 형태인 것을 알 수 있으며,

 

그 다음 줄 arr1[[0]] 인 경우는 arr1[0]과 다르게 0 행 1열의 2차원 배열을 의미하며 [[10. 10. 10]] 을 출력하였습니다.

 

 

반응형
반응형

점수를 입력받을 score 배열 크기 5

순위를 매길 rank 배열 크기 5

 

8번째 줄 for문을 통해 점수를 총 5차례 입력 받습니다.

13번째 줄 : 입력받은 점수 5개를 출력해줍니다.

18번째 줄 : index를 임시저장변수로 두고 i번째 점수를 index에 저장한 후 

19번째 줄 : score[j]배열을 사용하여 index에 저장된 점수와 비교하여 index의 값이 더 작다면 순위가 낮아야하므로 1을 증가시킵니다.

 

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
Scanner sc = new Scanner(System.in);
        
        int[] score = new int[5];
        int[] rank = new int[5];
        
        int index = 0;
        
        for(int i=0; i<score.length; i++) {
            System.out.print(i + 1 + "번 점수 입력 : ");
            score[i] = sc.nextInt();
            rank[i] = 1;
        }
        for (int i=0; i<score.length; i++) {
            System.out.println(score[i] + " ");
        }
        
        System.out.println();
        for(int i=0; i < score.length; i++) {
            for (int j=0; j<score.length; j++) {
                index = score[i];
                if(score[j] > index) 
                    rank[i] += 1;
            }
        }
        System.out.println("결과는 ");
        for(int i =0; i<rank.length; i++) {
            System.out.println(score[i] + "점은 " + rank[i] + "등");

 

출력 결과

 

1
2
3
4
5
6
7
8
9
10
11
12
95 
75 
66 
84 
10 
 
결과는 
95점은 1등
75점은 3등
66점은 4등
84점은 2등
10점은 5등
반응형
반응형

배열

성격과 크기가 일치하는 여러개의 기억 장소에 대해 대표명을 주고 첨자로 각 기억장소를 구분

반복처리에 효과적이다 !

 

배열 선언

 

방법1) 데이터 타입[] 배열 변수명

방법2) 데이터 타입 배열 변수명[];

ex) String[] name;

ex) int num[];

 

배열 생성

 

배열은 자바에서 객체 취급한다.

new 연산자에 의해 객체를 생성하고 할당받을 때는 배열의 크기를 정해준다.

데이터는 배열의 크기만큼 사용 가능하고

배열의 크기는 지정 이후 변경이 어렵습니다.

 

ex) name = new String[5];

ex) num = new int[10];

 

소스를 통해 알아보겠습니다.

 

변수 ar에 크기 5에 할당하는 배열을 주었습니다.

 

알아두면 유용한 문법 ! 

배열변수명.length : 배열의 크기를 알 수 있습니다 !
ar[0] 의 값은 10
ar[1] 의 값은 20 으로 할당해주었습니다.
ar[4] 의 값은 ar[0] 과 ar[1]의 데이터 값을 더한 값이므로 40
ar[3] 은 설정해준 값이 없으므로 0을 출력합니다.

 

1
2
3
4
5
6
int ar[] = new int[5]; // 배열의 크기를 5로 할당
        System.out.println("ar의 크기 : " + ar.length);
        ar[0= 10; ar[1= 20;
        ar[4= ar[0+ ar[1];
        System.out.println("ar[4]의 크기 : " + ar[4]);  // ar[0]의 10과 ar[1]의 20을 더하여 30 출력
        System.out.println("ar[3]의 크기 : "+ar[3]); // ar[3]은 정해준 데이터 값이 없어 0 출력
1
2
3
ar의 크기 : 5
ar[4]의 크기 : 30
ar[3]의 크기 : 0

다차원 배열

 

int num[][] = new int[][]; // 2차원 배열 - [행][열]

 

차원이 늘어갈수록 for는 다중으로 입력해주어야한다.

ex) 2차원 배열은 for문 2개

 

su 배열에 3행 4열의 크기를 주었습니다.

 

num은 10으로 for문을 통해 해당하는 배열의 행과열에 num 값을 1씩 증가시켜서 저장했습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
        int su[][] = new int[3][4];
 
        int num = 10;
 
 
        for(int i=0; i <su.length; i++) {
            for(int j=0; j<su[i].length; j++) {
 
            su[i][j] = num++;
            System.out.print(su[i][j] + " ");
            }
            System.out.println();
        }
 

출력 결과

1
2
3
4
10 11 12 13 
14 15 16 17 
18 19 20 21 
 

가변배열

 

예를 들어 설명하겠습니다.

 

int[][] scores = new int[2][] 으로 열은 따로 설정되어있지 않습니다.

이같은 열을

2,3번째 줄과 같이 유동적으로 설정이 가능합니다. 이것을 가변배열이라고합니다.

1
2
3
4
int[][] scores = new int[2][];
        scores[0= new int[2];
        scores[1= new int[3];
        System.out.println(scores.length + " " + scores[0].length + " " + scores[1].length);

 

4번째 줄을 출력하면 다음과 같은 결과값이 나옵니다.

 

1
2 2 3

 

해당 관련 연습문제

2020/03/03 - [JAVA/JAVA 프로그래밍 응용] - 배열을 이용한키보드로 5개의 점수를 입력받아 출력하기

반응형

'JAVA > JAVA' 카테고리의 다른 글

7 - 메소드  (0) 2020.03.04
6 - 클래스 ( class )  (0) 2020.03.03
4 - 조건문 if & switch  (0) 2020.03.03
3 - 반복문 for & while  (0) 2020.03.03
2 - 연산자  (0) 2020.03.03

+ Recent posts