|
3719 | 3719 | "cell_type": "markdown", |
3720 | 3720 | "metadata": {}, |
3721 | 3721 | "source": [ |
3722 | | - "### 브로드캐스팅과 항목 대체" |
| 3722 | + "### 슬라이싱과 브로드캐스팅" |
3723 | 3723 | ] |
3724 | 3724 | }, |
3725 | 3725 | { |
|
4471 | 4471 | } |
4472 | 4472 | }, |
4473 | 4473 | "source": [ |
4474 | | - "(3) 피어슨 데이터셋(`pearson`)의 단위는 센티미터(cm)로 되어 있다. 단위를 인치(inch)로 변환하기 위해 전체 데이터에 $1/2.54$를 곱한 후, 소수점 첫째 자리까지만 남기려고 한다. 또한, 데이터 수집 과정의 오류로 인해 처음 5개 가족(인덱스 0~4)의 기록이 완전히 삭제되어 모두 0으로 초기화해야 하는 상황이라고 가정하자.\n", |
| 4474 | + "(3) 피어슨 데이터셋(`pearson`)의 단위는 센티미터(cm)로 되어 있다. 단위를 인치(inch)로 변환하기 위해 전체 데이터에 $1/2.54$를 곱한 후, 소수점 첫째 자리까지만 남기려고 한다. 또한, 데이터 수집 과정의 오류로 인해 처음 5개 가족(인덱스 0~4)의 기록에 문제가 있어 모두 0으로 초기화해야 하는 상황이라고 가정한다.\n", |
4475 | 4475 | "\n", |
4476 | 4476 | "가. 모든 키 데이터를 인치 단위로 변환하여 새로운 어레이 `pearson_inch`에 저장하고, 이 어레이의 모든 값을 `np.round()` 함수를 이용해 소수점 첫째 자리까지 반올림하라." |
4477 | 4477 | ] |
|
4528 | 4528 | "\n", |
4529 | 4529 | "어레이를 2.54로 나누면 브로드캐스팅이 작동하여 모든 항목이 동시에 계산된다. \n", |
4530 | 4530 | "이후 `np.round(어레이, 1)`을 통해 모든 요소를 소수점 1자리까지 쉽게\n", |
4531 | | - "계산할 수 있다." |
| 4531 | + "계산할 수 있다.\n", |
| 4532 | + "`np.round()` 함수는 다른 어레이 연산자처럼 항목별로 작동한다.\n", |
| 4533 | + "즉, 어레이에 포함된 각각의 항목에 대해 `round()` 함수가 적용된다." |
4532 | 4534 | ] |
4533 | 4535 | }, |
4534 | 4536 | { |
|
4594 | 4596 | "metadata": {}, |
4595 | 4597 | "source": [ |
4596 | 4598 | "부울 인덱싱<font size='2'>boolean indexing</font>은\n", |
4597 | | - "지금까지 소개한 인덱싱/슬라이싱 기법이 처리하지 못하는 기능을 제공한다." |
| 4599 | + "`True/False`로 구성된 부울 어레이를 인덱스로 사용하여 조건에 맞는 항목만 선택하거나 수정하는 기법으로, 일반 인덱싱/슬라이싱으로는 처리하기 어려운 조건부 추출이 가능하다." |
4598 | 4600 | ] |
4599 | 4601 | }, |
4600 | 4602 | { |
|
4620 | 4622 | }, |
4621 | 4623 | { |
4622 | 4624 | "cell_type": "code", |
4623 | | - "execution_count": null, |
| 4625 | + "execution_count": 3, |
4624 | 4626 | "metadata": {}, |
4625 | 4627 | "outputs": [ |
4626 | 4628 | { |
4627 | 4629 | "data": { |
4628 | 4630 | "text/plain": [ |
4629 | | - "array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')" |
| 4631 | + "array(['김', '정', '우', '김', '우', '정', '정'], dtype='<U1')" |
4630 | 4632 | ] |
4631 | 4633 | }, |
| 4634 | + "execution_count": 3, |
4632 | 4635 | "metadata": {}, |
4633 | | - "output_type": "display_data" |
| 4636 | + "output_type": "execute_result" |
4634 | 4637 | } |
4635 | 4638 | ], |
4636 | 4639 | "source": [ |
4637 | | - "names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])\n", |
| 4640 | + "names = np.array(['김', '정', '우', '김', '우', '정', '정'])\n", |
4638 | 4641 | "names" |
4639 | 4642 | ] |
4640 | 4643 | }, |
4641 | 4644 | { |
4642 | 4645 | "cell_type": "markdown", |
4643 | 4646 | "metadata": {}, |
4644 | 4647 | "source": [ |
4645 | | - "* (7, 4) 모양의 2차원 어레이. `randn()` 함수는 표준 정규 분포를 이용하여 임의의 부동소수점으로 이루어진 어레이를 생성한다." |
| 4648 | + "* (7, 4) 모양의 2차원 어레이." |
4646 | 4649 | ] |
4647 | 4650 | }, |
4648 | 4651 | { |
4649 | 4652 | "cell_type": "code", |
4650 | | - "execution_count": null, |
| 4653 | + "execution_count": 12, |
4651 | 4654 | "metadata": {}, |
4652 | 4655 | "outputs": [ |
4653 | 4656 | { |
4654 | 4657 | "data": { |
4655 | 4658 | "text/plain": [ |
4656 | | - "array([[ 1.7886, 0.4365, 0.0965, -1.8635],\n", |
4657 | | - " [-0.2774, -0.3548, -0.0827, -0.627 ],\n", |
4658 | | - " [-0.0438, -0.4772, -1.3139, 0.8846],\n", |
4659 | | - " [ 0.8813, 1.7096, 0.05 , -0.4047],\n", |
4660 | | - " [-0.5454, -1.5465, 0.9824, -1.1011],\n", |
4661 | | - " [-1.185 , -0.2056, 1.4861, 0.2367],\n", |
4662 | | - " [-1.0238, -0.713 , 0.6252, -0.1605]])" |
| 4659 | + "array([[ 2, 5, 8, 11],\n", |
| 4660 | + " [14, 17, 20, 23],\n", |
| 4661 | + " [26, 29, 32, 35],\n", |
| 4662 | + " [38, 41, 44, 47],\n", |
| 4663 | + " [50, 53, 56, 59],\n", |
| 4664 | + " [62, 65, 68, 71],\n", |
| 4665 | + " [74, 77, 80, 83]])" |
4663 | 4666 | ] |
4664 | 4667 | }, |
| 4668 | + "execution_count": 12, |
4665 | 4669 | "metadata": {}, |
4666 | | - "output_type": "display_data" |
| 4670 | + "output_type": "execute_result" |
4667 | 4671 | } |
4668 | 4672 | ], |
4669 | 4673 | "source": [ |
4670 | | - "np.random.seed(3)\n", |
4671 | | - "\n", |
4672 | | - "data = np.random.randn(7, 4)\n", |
| 4674 | + "data = np.arange(2, 84, 3).reshape((7, 4))\n", |
4673 | 4675 | "data" |
4674 | 4676 | ] |
4675 | 4677 | }, |
|
4679 | 4681 | "source": [ |
4680 | 4682 | "부울 인덱싱을 설명하기 위해 `data` 가 가리키는 2차원 어레이의 각 행과 `names` 어레이가 가리키는 각 항목이\n", |
4681 | 4683 | "서로 연관된다고 가정한다. \n", |
4682 | | - "예를 들어, `'Bob'`은 0번 인덱스와 3번 인덱스의 행과 연관되고,\n", |
4683 | | - "`'Joe'`는 1번, 5번, 6번 인덱스의 행과 연관된다.\n", |
| 4684 | + "- `'김'`: 0번, 3번 인덱스,\n", |
| 4685 | + "- `'정'`: 1번, 5번, 6번 인덱스\n", |
| 4686 | + "- `'우'`: 2번, 4번 인덱스\n", |
4684 | 4687 | "\n", |
4685 | | - "이제 `data` 어레이에서 `'Bob'`과 연관된 행만 추출하여 2차원 어레이를 생성하려 해보자.\n", |
4686 | | - "먼저 `names`에 포함된 이름이 `'Bob'`인지 여부를 확인한다.\n", |
| 4688 | + "이제 `data` 어레이에서 `'김'`과 연관된 행만 추출하여 2차원 어레이를 생성해보자.\n", |
| 4689 | + "먼저 `names`에 포함된 이름이 `'김'`인지 여부를 확인한다.\n", |
4687 | 4690 | "그러면 진리값으로 이루어진 길이가 7인 어레이가 생성된다." |
4688 | 4691 | ] |
4689 | 4692 | }, |
4690 | 4693 | { |
4691 | 4694 | "cell_type": "code", |
4692 | | - "execution_count": null, |
| 4695 | + "execution_count": 13, |
4693 | 4696 | "metadata": {}, |
4694 | 4697 | "outputs": [ |
4695 | 4698 | { |
|
4698 | 4701 | "array([ True, False, False, True, False, False, False])" |
4699 | 4702 | ] |
4700 | 4703 | }, |
| 4704 | + "execution_count": 13, |
4701 | 4705 | "metadata": {}, |
4702 | | - "output_type": "display_data" |
| 4706 | + "output_type": "execute_result" |
4703 | 4707 | } |
4704 | 4708 | ], |
4705 | 4709 | "source": [ |
4706 | | - "name_Bob = (names == 'Bob')\n", |
4707 | | - "name_Bob" |
| 4710 | + "name_김 = (names == '김')\n", |
| 4711 | + "name_김" |
4708 | 4712 | ] |
4709 | 4713 | }, |
4710 | 4714 | { |
4711 | 4715 | "cell_type": "markdown", |
4712 | 4716 | "metadata": {}, |
4713 | 4717 | "source": [ |
4714 | | - "이제 `name_Bob`을 `data` 2차원 어레이에 인덱싱으로 적용하면\n", |
| 4718 | + "이제 `name_김`을 `data` 2차원 어레이에 인덱싱으로 적용하면\n", |
4715 | 4719 | "`True`가 위치한 인덱스에 해당하는 행인 0번과 3번 행만 추출해서\n", |
4716 | 4720 | "새로운 2차원 어레이를 생성한다." |
4717 | 4721 | ] |
4718 | 4722 | }, |
4719 | 4723 | { |
4720 | 4724 | "cell_type": "code", |
4721 | | - "execution_count": null, |
| 4725 | + "execution_count": 14, |
4722 | 4726 | "metadata": {}, |
4723 | 4727 | "outputs": [ |
4724 | 4728 | { |
4725 | 4729 | "data": { |
4726 | 4730 | "text/plain": [ |
4727 | | - "array([[ 1.7886, 0.4365, 0.0965, -1.8635],\n", |
4728 | | - " [ 0.8813, 1.7096, 0.05 , -0.4047]])" |
| 4731 | + "array([[ 2, 5, 8, 11],\n", |
| 4732 | + " [38, 41, 44, 47]])" |
4729 | 4733 | ] |
4730 | 4734 | }, |
| 4735 | + "execution_count": 14, |
4731 | 4736 | "metadata": {}, |
4732 | | - "output_type": "display_data" |
| 4737 | + "output_type": "execute_result" |
4733 | 4738 | } |
4734 | 4739 | ], |
4735 | 4740 | "source": [ |
4736 | | - "data[name_Bob]" |
4737 | | - ] |
4738 | | - }, |
4739 | | - { |
4740 | | - "cell_type": "markdown", |
4741 | | - "metadata": {}, |
4742 | | - "source": [ |
4743 | | - "인덱싱에 사용되는 부울 어레이의 길이가 사용되는 인덱싱에 적용되는 축의 길이와 동일해야 함에 주의한다." |
| 4741 | + "data[name_김]" |
4744 | 4742 | ] |
4745 | 4743 | }, |
4746 | 4744 | { |
|
4761 | 4759 | "cell_type": "markdown", |
4762 | 4760 | "metadata": {}, |
4763 | 4761 | "source": [ |
4764 | | - "* 행 기준: Bob이 포함된 행의 인덱스를 갖는 행\n", |
| 4762 | + "* 행 기준: 김이 포함된 행의 인덱스를 갖는 행\n", |
4765 | 4763 | "* 열 기준: 3번 열" |
4766 | 4764 | ] |
4767 | 4765 | }, |
|
4781 | 4779 | } |
4782 | 4780 | ], |
4783 | 4781 | "source": [ |
4784 | | - "data[name_Bob, 3]" |
| 4782 | + "data[name_김, 3]" |
4785 | 4783 | ] |
4786 | 4784 | }, |
4787 | 4785 | { |
4788 | 4786 | "cell_type": "markdown", |
4789 | 4787 | "metadata": {}, |
4790 | 4788 | "source": [ |
4791 | | - "* 행 기준: Bob이 포함된 행의 인덱스를 갖는 행\n", |
| 4789 | + "* 행 기준: 김이 포함된 행의 인덱스를 갖는 행\n", |
4792 | 4790 | "* 열 기준: 2번 열 이후 전체" |
4793 | 4791 | ] |
4794 | 4792 | }, |
|
4809 | 4807 | } |
4810 | 4808 | ], |
4811 | 4809 | "source": [ |
4812 | | - "data[name_Bob, 2:]" |
| 4810 | + "data[name_김, 2:]" |
4813 | 4811 | ] |
4814 | 4812 | }, |
4815 | 4813 | { |
|
4827 | 4825 | "논리 연산자(`~`, `&`, `|`)를 적용하여 생성된 부울 어레이 표현식이다.\n", |
4828 | 4826 | "마스크를 활용하면 보다 다양한 부울 인덱싱을 간단하게 적용할 수 있다.\n", |
4829 | 4827 | "\n", |
4830 | | - "예를 들어, 이름이 `'Bob'`이 아닌 이름과 연관된 행만 가져오려면\n", |
| 4828 | + "예를 들어, 이름이 `'김'`이 아닌 이름과 연관된 행만 가져오려면\n", |
4831 | 4829 | "`==` 대신에 `!=`를 이용하거나 `==`와 `~` 연산자를 함께 이용한다." |
4832 | 4830 | ] |
4833 | 4831 | }, |
|
4851 | 4849 | } |
4852 | 4850 | ], |
4853 | 4851 | "source": [ |
4854 | | - "mask = names != 'Bob'\n", |
| 4852 | + "mask = names != '김'\n", |
4855 | 4853 | "data[mask]" |
4856 | 4854 | ] |
4857 | 4855 | }, |
|
4875 | 4873 | } |
4876 | 4874 | ], |
4877 | 4875 | "source": [ |
4878 | | - "mask = ~name_Bob\n", |
| 4876 | + "mask = ~name_김\n", |
4879 | 4877 | "data[mask]" |
4880 | 4878 | ] |
4881 | 4879 | }, |
4882 | 4880 | { |
4883 | 4881 | "cell_type": "markdown", |
4884 | 4882 | "metadata": {}, |
4885 | 4883 | "source": [ |
4886 | | - "다음은 `'Bob'` 또는 `'Will'` 이 위치한 인덱스에 해당하는 행만 가져온다." |
| 4884 | + "다음은 `'김'` 또는 `'우'` 이 위치한 인덱스에 해당하는 행만 가져온다." |
4887 | 4885 | ] |
4888 | 4886 | }, |
4889 | 4887 | { |
|
4905 | 4903 | } |
4906 | 4904 | ], |
4907 | 4905 | "source": [ |
4908 | | - "mask = (names == 'Bob') | (names == 'Will')\n", |
| 4906 | + "mask = (names == '김') | (names == '우')\n", |
4909 | 4907 | "data[mask]" |
4910 | 4908 | ] |
4911 | 4909 | }, |
|
4921 | 4919 | "metadata": {}, |
4922 | 4920 | "source": [ |
4923 | 4921 | "마스크를 이용하여 전체 행 또는 전체 열을 특정 값으로 변경할 수 있다.\n", |
4924 | | - "아래 코드는 `data`에서 `'Joe'`와 관련 없는 행의 항목을 모두 7로 변경한다." |
| 4922 | + "아래 코드는 `data`에서 `'정'`와 관련 없는 행의 항목을 모두 7로 변경한다." |
4925 | 4923 | ] |
4926 | 4924 | }, |
4927 | 4925 | { |
|
4946 | 4944 | } |
4947 | 4945 | ], |
4948 | 4946 | "source": [ |
4949 | | - "mask = names != 'Joe'\n", |
| 4947 | + "mask = names != '정'\n", |
4950 | 4948 | "data[mask] = 7\n", |
4951 | 4949 | "data" |
4952 | 4950 | ] |
|
5502 | 5500 | } |
5503 | 5501 | ], |
5504 | 5502 | "source": [ |
5505 | | - "data2 = data[names == 'Bob']\n", |
| 5503 | + "data2 = data[names == '김']\n", |
5506 | 5504 | "data2" |
5507 | 5505 | ] |
5508 | 5506 | }, |
|
0 commit comments