conda 설치후 아래와 같은 에러가 발생


$ conda activate myenv
usage: conda [-h] [--no-plugins] [-V] COMMAND ...
conda: error: argument COMMAND: invalid choice: 'activate' (choose from 'clean', 'compare', 'config', 'create', 'info', 'init', 'install', 'list', 'notices', 'package', 'remove', 'uninstall', 'rename', 'run', 'search', 'update', 'upgrade', 'build', 'content-trust', 'convert', 'debug', 'develop', 'doctor', 'index', 'inspect', 'metapackage', 'render', 'skeleton', 'verify', 'pack', 'token', 'server', 'env', 'repo')

 

 

해결방법: conda 초기화가 안되어 발생하는 문제


1. Conda 업데이트: 먼저 Conda를 최신 버전으로 업데이트하십시오. 아래 명령어를 실행하여 Conda를 업데이트합니다.

$ conda update -n base -c defaults conda

 

2. 시스템 환경 변수 확인: Conda가 설치된 경로를 시스템 환경 변수에 제대로 추가했는지 확인하십시오. 다음 명령어를 사용하여 Conda의 경로를 확인하고 확인하세요. "/home/사용자/anaconda3/bin" 이러한 경로가 존재해야합니다.

$ echo $PATH
/home/<사용자>/anaconda3/bin:/home/heon/anaconda3/condabin:/home/heon/.vscode-server/bin/e7e037083ff4455cf320e344325dacb480062c3c/bin/remote-cli:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0:/mnt/c/Windows/System32/OpenSSH:/mnt/c/Users/4pygm/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/4pygm/AppData/Local/Programs/Microsoft VS Code/bin:/snap/bin

 

3. shell 재시작

$ source ~/.bashrc  # 또는 ~/.zshrc

 

4. Conda 초기화

$ conda init

 

반응형
import mlflow
from setting import parent_run_id

mlflow.set_tracking_uri(TRACKING_URI)

child_run_ids = list()
for run in client.search_runs(experiment_ids=[6]):

    if "mlflow.parentRunId" not in run.data.tags:
        continue

    if run.data.tags["mlflow.parentRunId"] != parent_run_id:
        continue

    child_run_ids.append(run.info.run_id)
반응형
%load_ext autoreload
%autoreload 2
반응형

 

 

에지(edge)


에지(엣지, edge)은 서로 다른 물체의 경계면에 나타내는 경계선을 의미합니다. 이 경계 주변이 픽셀들의 분포를 생각해보면, 명암의 급격한 변화가 있게 됩니다. 아래의 강아지 사진을 보면, 강아지의 눈을 주변으로 경계는 명암차이가 극명합니다(Figure 1). 이러한 명암차이로, 흰색강아지털과 검은색 눈동자의 경계면을 사람도 인식할 수 있습니다. 에지 검출알고리즘은 이렇듯 명암차이가 극명하게 나는 지점을 추출하기 위한, 여러 연산자(+알고리즘)을 사용하는 것이 공통적입니다.

Figure 1. 포메라니안 강아지

 

 

미분을 이용한 에지의 검출


에지의 검출은 명암변화가 급격히 일어나는 지점을 찾는 것이라고 했습니다. 수학적으로는 변화가 급격하게 일어나는 지점을 찾는 것은 미분을 이용합니다. 하지만, 디지털영상에서는 변화가 급격하게 일어나는 지점을 찾으려면 어떻게 해야할까요? 미분을 이용하고 싶지만, 아래와 같이 미분연산에서 극한을 취급할 수 없습니다. 왜냐하면, 디지털영상은 이산형이이기 때문에(=연속이 아님), 미분을 취급하기 어렵습니다. 따라서, 아래와 같이 옆 픽셀과의 차이로 계산합니다.

$f'(x)=\frac{df}{dx}=\frac{f(x+1)-f(x)}{\Delta x}=f(x+1)-f(x)$ (픽셀위치차이를 1로 고려하여)

함수 식은 위와 같고, 이를 영상에 적용려면, 필터(연산자, 커널)를 하나 정할 수 있습니다. 바로 [-1, 1]커널 입니다. 아래와 같이 f(x+1), f(x)인 박스(픽셀)에 [-1, 1] 어레이를 곱하면, 미분값을 구할 수 있습니다. 

하지만, 현실세계에서는 이와 같이 경계면이 확확 바뀌지않습니다. 위의 식으로 아래의 그림(figure 3)의 좌측을 계산한다면, 엣지가 f(x+1), f(x)의 차이가 커서 구분이 잘되겠지만, 우측의 램프엣지(ramp edge)의 형태인 경우는 램프엣지 구간의 명암차이가 일정하게 나타날 것입니다. 그래서, 이 방법론으로는 한계가 있습니다.

Figure 3. 이상적인 엣지(계단형 엣지)와 램프엣지의 형태 (10.14445/22312803/IJCTT-V23P110)

 

하지만, 1차미분이아닌 2차미분을 이용하면 램프엣지(ramp edge)에서도 경계면을 찾을 수 있습니다. 아래의 그림의 좌측(Figure 4), 램프엣지가 있다고할 때, 이 명암의 크기는 우측상단의 그림처럼 보여질 것 입니다. 그리고 이를 1차미분하면 위의 블록이 하나 있는 것처럼 보이는 봉우리가 나타날 것입니다. 그리고, 여기서 한번 더 미분한 (2차미분) 값을 구하면, 1차미분에서 봉우리의 시작점, 출발점 사이의 가상의 선이 무조건 0을 지나게됩니다. 즉, 2차 도함수를 이용하여, 영교차(zero-crossing)하는 지점을 찾으면, 램프엣지에서도 경계선을 찾을 수 있습니다.

Figure 4. 램프엣지에서의 경계구하기 https://www.52coding.com.cn/2018/12/04/RS%20-%20Recognizing%20Image%20Features%20and%20Patterns/

위의 영상은 1차원의 공간에서 명암을 기준으로 했기에, 이제 2차원으로 확장해봅니다. 단순히 1차원을 2차원으로 확장하면, x, y축에서의 미분값을 구하면됩니다. 그 식은 아래와 같습니다. 1차도함수 먼저 정의하고, 1차도함수를 2번사용하면 2차도함수를 구할 수 있습니다.

$\nabla f(y,x)=f'(y, x)=(f(y+1, x)-f(y,x), f(y, x+1)-f(y,x))= (d_{y},d_{x})$

하지만, 실제로는 잡음이 있어서 위와 같이 픽셀 하나차이의로만은 노이즈가 있어, 두 픽셀 사이로 영교차 이론을 적용합니다. 그렇기에 실무적으로 쓰이는 공식은 아래와 같습니다.  이렇게 되면 실제 마스크(kernel)은 [-1, 0, 1]와 같은 커널을 적용할 수 있습니다.

$\nabla f(y,x)=f'(y, x)=(f(y+1, x)-f(y-1,x), f(y, x+1)-f(y,x+1))= (d_{y},d_{x})$

위와 같이 엣지를 구할 수 있으면, 추가적으로 다음의 두 개념(엣지강도, 그레디언트 방향)을 구할 수 있습니다.

  • manitude($\nabla f(y,x)$) = $\sqrt{d_{y}^{2}+d_{x}^{2}}$
  • Gradient orientation: $ \theta = tan^{-1}(\frac{d_{y}}{d_{x}}) $

 

Sobel filter: 1차원 가우시안 필터(Smoothing)을 이용한 필터  + 미분


현실세계에서는 필터를 적용할 때, 이미지의 픽셀이 노이즈가 많기 때문에 이를 리덕션해줄 필요가 있습니다. 가우시안 필터는 이러한 경우 흐릿하게하는 블러(blurring)에 사용되는데요. 소벨필터는 이 가우시안 필터와 x,y 축별로의 그레디언트를 혼합하여 사용하는 필터입니다. 그렇기에 상대적으로 노이즈에 덜 민감한 편입니다.

Sobel filter 및 분해

 

 

Prewitt operation: 평균필터 + x,y 미분


프레윗 연산은 소벨과 다르게, 평균으로만 스무딩필터를 적용합니다. 그 결과 아래와 같은 커널을 얻을 수 있습니다.

Prewitt filter 및 분해

[1] https://theailearner.com/tag/cv2-sobel/

반응형

이 포스팅은 GitHub Actions를 사용하여 이미지를 생성하고, Amazon Elastic Container Registry (ECR)에 업로드한 후, EC2 인스턴스에 배포하는 단계를 설명합니다.

이 과정은 크게 아래와 같이 이루어집니다.

  1. 개발자가 trigger: 개발자가 github에 코드를 commit / push 등 엑션을 하하고, 리포지토리에서 action trigger가 실행
  2. Action에서 이미지 빌딩 및 푸시: github action에서 이미지 빌드: Dockerfile을 이용하여 이미지를 만들고, 만든 이미지를 ECR에 PUSH
  3. Actiond에서 SSH 접속 후 Pull 및 Run: Action에서 EC2인스턴스에 SSH로 접속하여, ECR에 올려져있는 이미지를 PULL 및 RUN

GitHub Actions를 사용하여 이미지를 생성하고, Amazon Elastic Container Registry (ECR)에 업로드한 후, EC2 인스턴스에 배포하는 단계

 

이 과정을 위해, 사전 요구사항 및 단계는 다음과 같이 나뉩니다:

사전 요구사항(Preliquesite)

  1. Dockerfile 만들기
  2. IAM 생성 및 권한 설정
  3. Github secrets 설정하기

Github Action 설정

  1. Action yaml파일 설정하기
  2. AWS 자격증명: AWS 액세스 키와 시크릿 키, 그리고 지정한 AWS 리전을 사용하여 AWS 자격증명을 설정합니다.
  3. ECR에 로그인: Docker를 ECR에 푸시하기 전에 ECR에 로그인을 수행
  4. Docker 이미지 빌드:   Docker 이미지를 빌드
  5. Docker 이미지 ECR로 푸시: 이미지를 ECR로 푸시하기 위해 해당 이미지를 태깅하고, ECR에 로그인한 뒤 이미지를 푸시합니다.
  6. EC2 인스턴스로 SSH 접속:
    5.1암호화된 PEM 파일을 사용하여 EC2 인스턴스로 SSH 접속합니다.
    SSH로 EC2 인스턴스에 접속한 후, ECR에서 이미지를 풀고 해당 이미지를 실행합니다.

 

 

사전 요구사항


1. Dockerifle 생성: ECR에 올려서 PUSH/PULL할 것이기 때문에, 간단한 Dockerfile을 하나 생성합니다.

//Dockerfile
# 베이스 이미지로 Python 3.8을 사용합니다.
FROM python:3.8

# 작업 디렉토리를 /app으로 설정합니다.
WORKDIR app

# 현재 디렉토리의 모든 파일을 /app 디렉토리로 복사합니다.
COPY . .

# Python 종속성을 설치합니다.b
RUN pip install --no-cache-dir -r requirements.txt
RUN pip install uvicorn

# 앱을 실행합니다.
CMD ["uvicorn", "app:app", "--reload"]

아래와 같이 app.py (FastAPI의 앱)을 간단히 생성합니다.

//app.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

requirements.txt도 하나 생성합니다.

//requirement.txt
fastapi

 

 

2. IAM 생성, 키 생성 및 권한 부여: IAM 생성및 EC2, ECR 관련 권한부여

AWS Identity and Access Management (IAM)은 Amazon Web Services (AWS)에서 제공하는 서비스로, AWS 리소스에 대한 액세스를 관리하고 보안을 강화하는 데 사용됩니다. IAM을 사용하여 AWS 계정에 사용자, 그룹 및 역할을 생성하고, 이러한 엔터티에 대한 권한을 정의하여 AWS 리소스에 대한 액세스를 제어할 수 있습니다. 본 과정에서는 github action으로 AWS 리소스(ECR, EC2)을 제어 하기 위함입니다.

권한은 아래와 같이, "AdministratorAccess" 와 "AmazonEC2ContainerRegistryFullAccess"을 할당했습니다.

 

3. Github secrets 설정: 리포지토리 내, Settings-Security 내 Secrets and variable - Actions 등록

Action secrets는 GitHub Actions 워크플로우에서 사용되는 민감한 정보를 안전하게 저장하고 관리하기 위한 기능입니다. Secrets는 암호화되어 안전한 저장소에 저장되며, 워크플로우 실행 시에만 필요한 환경 변수로 사용할 수 있습니다. Action에서 사용하게되는 변수들을 repository에서 안전하게 저장하고, action에서 사용하는 yaml파일에서 접근이 가능합니다.

다음과 같이 등록이 필요합니다.

  • AWS_ACCESS_KEY_ID: AWS(Amazon Web Services) 계정에 액세스하는 데 사용되는 액세스 키의 ID 부분입니다. AWS API에 액세스할 때 사용
  • AWS_SECRET_ACCESS_KEY: AWS(Amazon Web Services) 계정에 액세스하는 데 사용되는 액세스 키의 시크릿 키 부분입니다. AWS API에 액세스할 때 사용
  • AWS_REGION: AWS 리소스가 위치한 지역(region)을 지정하는 변수. 참고로 ap-northeast-2=아시아 태평양(서울)입니다.
  • REPO_NAME: ECR 리포지토리에 접근하는 데 사용되는 계정 ID 또는 별칭입니다. ECR에 도커 이미지를 푸시하거나 불러올 때 사용
  • EC2_PRIVATE_KEY: AWS EC2 인스턴스에 SSH로 접속할 때 사용되는 개인 키(private key). EC2의 pem키의 내용을 그대로 copy & paste하시면 됩니다. "--benign", "--end"을 포함하여 plain text로 복붙하시면됩니다!

github actions secret이 등록된 화면

 

4. ECR 생성하기: dockerhub을 이용하셨다면, 같은 기능을 하는 AWS의 dockerhub라고 보셔도 무관합니다.

AWS 검색화면에서 ECR을 검색하여 다음과 같이, 리포지토리(repository)을 생성합니다. 아래와 같이 private으로 설정할 수 있습니다. 그리고, Repository name에보면, "숫자".dkr.ecr.ap-northeast-2.amazonaws.com 으로 나열되는데 "숫자"에 해당하는 부분이 aws_account_id이고, ap-northeast-2가 region입니다[1]. aws_account_id도 secret_key로 본 포스팅에서는 등록하였습니다.

ECR (리포지토리) 생성과정 화면
ECR 생성후 리포지토리 화면

[1] https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth

 

 

Action 설정하기


1. Action yaml파일 생성: github/workflows 디렉토리에 새 워크플로우 파일을 생성합니다. 예를 들어, deploy.yml 파일을 만들 수 있습니다. 아래와 같이 "set up a workflow yourself"을 눌러 workflow(yaml파일)을 처음부터 작성할 수 있습니다.

Actions 클릭 후 화면
"set up a workflow yourself" 을 클릭 후 화면

 

그리고, 아래와 같이 yaml파일의 초반부를 작성합니다.

name: Deploy to EC2 with ECR
on:
  push:
    branches:
      - main   # 배포할 브랜치를 선택합니다. 원하는 브랜치로 변경 가능

env:
  EC2_USER: ubuntu
  EC2_HOST: <EC2의 IPv4 공개IP>
  
jobs:
  deploy:
  runs-on: ubuntu-latest

  steps:
  - name: Checkout repository
    uses: actions/checkout@v2

 

AWS 자격증명: AWS 액세스 키와 시크릿 키, 그리고 지정한 AWS 리전을 사용하여 AWS 자격증명을 설정합니다.

    - name: Configure AWS Credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ secrets.AWS_REGION }}

 

ECR에 로그인: Docker를 ECR에 푸시하기 전에 ECR에 로그인을 수행

    - name: Login to ECR
      id: ecr
      uses: jwalton/gh-ecr-login@v1
      with:
        access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        region: ${{ secrets.AWS_REGION }}

 

Docker 이미지 빌드:   Docker 이미지를 빌드

    - name: Build image
      run: |
        docker build --tag my-image:latest .

 

Docker 이미지 ECR로 푸시: 이미지를 ECR로 푸시하기 위해 해당 이미지를 태깅하고, ECR에 로그인한 뒤 이미지를 푸시합니다. 위의 단계에서 만든 "my-image:latest"의 이미지를 ECR로 푸시하기위해서, ECR에 로그인하고, ECR리포지토리에 맞게 테그명을 변경합니다. 만일 ECR의 URL가 "000000000.dkr.ecr.ap-northeast-2.amazonaws.com/my-image" 였다면, 이미지도 재 태그하여 "000000000.dkr.ecr.ap-northeast-2.amazonaws.com/my-image:<버전테그>" 형식어야합니다. 즉 "/????"의 이름도 같아야합니다.

    - name : Push to ECR
      env:
        AWS_REGION: ${{ secrets.AWS_REGION }}
        AWS_ACCOUNT: ${{ secrets.AWS_ECR_ACCOUNT }}
        IMAGE_TAG: ${{ github.sha }}
      run: |
        aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com
        docker tag my-image:$IMAGE_TAG $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com/my-image:$IMAGE_TAG
        docker push $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com/my-image:$IMAGE_TAG

 

EC2 인스턴스로 SSH 접속: EC2 인스턴스에 접속하기위해서 ".pem"파일의 내용을 sercrets 변수로부터 stdout을 "key.pem"을 작성을 합니다. 이를 이용하여 ssh -i <pem파일경로> 로 접속합니다. 그리고, SSH에 접속후에 ECR로부터 이미지를 pull 받고, 이미 띄워져있는 컨테이너가있다면 중단, 삭제하고, 새로운 이미지를 컨테이너로 구동합니다. 그리고 마지막으로 pem키를 삭제합니다.

    - name: SSH into EC2 instance and deploy
      env:
        AWS_REGION: ${{ env.AWS_REGION }}
        AWS_ACCOUNT: ${{ secrets.AWS_ECR_ACCOUNT }}
        EC2_USER:  ${{ env.EC2_USER }}
        EC2_HOST:  ${{ env.EC2_HOST }}
        IMAGE_TAG: ${{ github.sha }}
      run: |
        # Create PEM file from encrypted secret
        echo "${{ secrets.EC2_PRIVATE_KEY }}" > key.pem
        chmod 400 key.pem

        # SSH into the EC2 instance and perform deployment
        ssh -o "StrictHostKeyChecking no" -i key.pem $EC2_USER@$EC2_HOST \
          "sudo docker login -u AWS -p \"$(aws ecr get-login-password --region $AWS_REGION)\" $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com \
          && sudo docker pull $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com/my-image:$IMAGE_TAG \
          && sudo docker stop my-container || true \
          && sudo docker rm my-container || true \
          && sudo docker run -d --name my-container -p 8000:8000 $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com/my-image:$IMAGE_TAG" 

        # Remove pem
        rm key.pem

 

여기까지 작성했으면, 이제 trigger을 이용하여 action을 실행해볼 차례입니다 .임의의 파일을 수정하여 main에 push하여 tigger을 동작시키면 action화면에 아래와 같이 모든 job 의 실행이 보이게 됩니다.

 

전체 코드는 아래와 같습니다.

name: Deploy to EC2 with ECR
on:
  push:
    branches:
      - main 

  EC2_USER: ubuntu
  EC2_HOST: <IP>
  
jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Configure AWS Credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ secrets.AWS_REGION }}

    - name: Login to ECR
      id: ecr
      uses: jwalton/gh-ecr-login@v1
      with:
        access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        region: ${{ secrets.AWS_REGION }}

    - name: Build image
      run: |
        docker build --tag my-image:$IMAGE_TAG .

    - name : Push to ECR
      env:
        AWS_REGION: ${{ secrets.AWS_REGION }}
        AWS_ACCOUNT: ${{ secrets.AWS_ECR_ACCOUNT }}
        IMAGE_TAG: ${{ github.sha }}
      run: |
        aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com
        docker tag my-image:$IMAGE_TAG $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com/my-image:$IMAGE_TAG
        docker push $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com/my-image:$IMAGE_TAG

    - name: SSH into EC2 instance and deploy
      env:
        AWS_REGION: ${{ env.AWS_REGION }}
        AWS_ACCOUNT: ${{ secrets.AWS_ECR_ACCOUNT }}
        EC2_USER:  ${{ env.EC2_USER }}
        EC2_HOST:  ${{ env.EC2_HOST }}
        IMAGE_TAG: ${{ github.sha }}
      run: |
        # Create PEM file from encrypted secret
        echo "${{ secrets.EC2_PRIVATE_KEY }}" > key.pem
        chmod 400 key.pem

        # SSH into the EC2 instance and perform deployment
        ssh -o "StrictHostKeyChecking no" -i key.pem $EC2_USER@$EC2_HOST \
          "sudo docker login -u AWS -p \"$(aws ecr get-login-password --region $AWS_REGION)\" $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com \
          && sudo docker pull $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com/my-image:$IMAGE_TAG \
          && sudo docker stop my-container || true \
          && sudo docker rm my-container || true \
          && sudo docker run -d --name my-container -p 8000:8000 $AWS_ACCOUNT.dkr.ecr.$AWS_REGION.amazonaws.com/my-image:$IMAGE_TAG" 

        # Remove pem
        rm key.pem
반응형

요약


np.array()와 np.asarray()는 NumPy에서 배열을 생성하는 함수입니다.

그러나 두 함수 사이에는 몇 가지 차이점이 있습니다. 데이터가 복사가 되는지 여부와, 데이터 유형이 변화되는지 여부의 차이가 있습니다.

 

 

차이점 비교


  • 복사 여부
    - np.array(): 기본적으로 배열의 복사본을 생성합니다.
    - np.asarray(): 배열의 복사본을 생성하지 않고, 가능한 경우에는 입력 배열의 뷰(view)를 반환합니다. 즉, 입력 배열과 반환된 배열이 메모리를 공유할 수 있습니다.

 

  • 데이터 유형 변환:

    - np.array(): 입력된 데이터의 유형에 따라 새로운 배열의 데이터 유형이 결정됩니다. 필요에 따라 데이터 유형을 명시적으로 지정할 수도 있습니다.
    - np.asarray(): 입력된 배열과 동일한 데이터 유형을 갖는 배열을 생성합니다. 따라서 입력 배열의 데이터 유형을 유지합니다.

 

코드 비교


간단한 예제로 두 함수의 동작을 살펴보겠습니다. 아래의 예제에서 np.array()를 사용하여 배열 arr1을 생성하고, 이를 np.asarray()로 배열 arr2를 생성합니다. 그런 다음 arr1의 첫 번째 요소를 변경하면 arr2도 동일하게 변경됩니다. 즉, np.asarray()는 입력 배열과 같은 데이터를 참조하므로 변경 사항이 반영됩니다. 즉, arr1의 0번 인덱스만 변경했음에도, np.asarray은 array을 데이터를 그대로 참조하며, 뷰를 생성하므로 arr1을 변경함에따라 arr2도 변경됩니다.

요약하자면, np.array()는 항상 복사본을 생성하며, 데이터 유형 변환을 수행할 수 있습니다. np.asarray()는 가능한 경우에는 복사본 대신 입력 배열의 뷰를 반환하며, 데이터 유형 변환은 수행하지 않고 입력 배열의 데이터 유형을 유지합니다.

import numpy as np

arr1 = np.array([1, 2, 3])
arr2 = np.asarray(arr1)

arr1[0] = 99

print(arr1)  # 출력: [99  2  3]
print(arr2)  # 출력: [99  2  3]

 

반응형

+ Recent posts