본문 바로가기

개발하자

매트랩의 벡터 할당을 파이썬 형태로 변환

반응형

매트랩의 벡터 할당을 파이썬 형태로 변환

나는 일부 매트랩 코드를 파이썬으로 번역하려고 한다(NumPy 사용). 저는 Matlab에 대해 잘 알지 못하며, 구문 분석하는 데 어려움을 겪고 있는 줄을 발견했습니다.

w(idx(1:p, 1), 1) = v(idx(1:p, 1), 1) - theta;

나는 의 항목을 선택하기 위한 지수로 긴 머리가 사용되고 있고 의 항목이 (스칼라보다 적은)의 해당 항목으로 대체되고 있다고 추측할 수 있다.

옥타브에서 어슬렁거리면서, 그것은 그것이 무엇을 하고 있는지에 대한 정확한 설명인 것처럼 보이지만, 나는 그 효과에 대한 어떤 문서도 찾을 수 없다.

어쨌든, 파이썬에서 이 코드를 다시 쓰는 가장 좋은 방법은 무엇입니까? 저는 우아한 방법을 찾기 위해 NumPy '잠정 튜토리얼'을 살펴보았는데, 그것이 제가 찾고 있는 것일 수도 있습니다. 하지만, 저는 특히 과제 담당자와 함께 그것을 멋지게 꾸미는 데 어려움을 겪고 있어요. 이 할당 작업을 수행할 수 있는 더 우아하거나 관용적인 방법이 있습니까?




이것은 기본적으로 @Dan이 댓글에 쓴 것이지만 파이썬에서 0 기반 인덱싱을 설명한다.

w[idx[:p, 0], 0] = v[idx[:p, 0], 0] - theta

당신이 그것보다 더 우아한 것을 원했는지 확실하지 않다. 첫 번째 열만 수정해야 하는 경우 이러한 0이 필요합니다.




기본적인 행동에 대해서는 당신이 옳아요. 인덱스 행렬의 첫 번째 열에 있는 a-length 하위 벡터는 스칼라에 의해 먼저 값을 조정한 후 행렬에서 요소를 선택하고 해당 요소를 행렬의 동일한 위치에 배치하는 데 사용됩니다.

MATLAB의 경우 단일 기반 인덱싱을 사용하고 의 경우 0 기반 인덱싱을 사용하는 것이 중요합니다.

MATLAB에서.

clear

% Data matrices
w = zeros(5,5)
v = diag([10,20,30,40,50]) * ones(5,5)

% Indexing matrix
idx = ceil(5*rand(5, 5))

% Selection and adjustment parameters
p = 3    
theta = 1

% Apply adjustment and selection
w(idx(1:p, 1), 1) = v(idx(1:p, 1), 1) - theta

산출물을 생산하다

w =

     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     0     0


v =

    10    10    10    10    10
    20    20    20    20    20
    30    30    30    30    30
    40    40    40    40    40
    50    50    50    50    50


idx =

     3     1     2     3     4
     1     1     2     1     3
     4     1     2     2     2
     1     1     5     1     1
     1     2     4     5     4


theta =

     1


p =

     3


w =

     9     0     0     0     0
     0     0     0     0     0
    29     0     0     0     0
    39     0     0     0     0
     0     0     0     0     0

그리고, 다음을 사용하는 동등한 파이썬 코드.

import numpy as np

# Data arrays
w = np.zeros((5,5))
v = np.dot(np.diag([10, 20, 30, 40, 50]), np.ones((5,5)))
print "w = "
print w
print "v = "
print v

# Indexing array
idx = np.floor(5 * np.random.rand(5,5)).astype(int)
print "idx = "
print idx

# Selection and adjustment parameters
theta = 1
p = 3

# Apply selection and adjustment
w[idx[:p, 0], 0] = v[idx[:p, 0], 0] - theta
print "w = "
print w

그것은 출력을 생성한다.

w = 
[[ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]
 [ 0.  0.  0.  0.  0.]]
v = 
[[ 10.  10.  10.  10.  10.]
 [ 20.  20.  20.  20.  20.]
 [ 30.  30.  30.  30.  30.]
 [ 40.  40.  40.  40.  40.]
 [ 50.  50.  50.  50.  50.]]
idx = 
[[0 2 2 0 3]
 [1 2 1 2 4]
 [2 2 4 3 4]
 [0 1 1 4 4]
 [0 1 0 4 3]]
w = 
[[  9.   0.   0.   0.   0.]
 [ 19.   0.   0.   0.   0.]
 [ 29.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.]
 [  0.   0.   0.   0.   0.]]

반응형